This is Kara’s attempt to think about patterns of prevalence across sites: What proportion of participants in each site endorsed each question, and can we find “clusters” of questions that were either similar in prevalence across sites or difference across sites in various ways?

This is inspired by Ann’s ideas on 2018-10-08, but uses a somewhat different strategy.

Update 2018-12-17: Now including tests of hypotheses from our meeting on 2018-12-10.

Notes: per our conversation with Nikki, we are dropping one question (#53), which was a repeated question in all sites except for China.

Make new dataset

First, I’m going to make a new dataset where, for each question, we have the proportion of yes reponses from each of the five field sites.

Joining, by = "taves_subj"
Joining, by = "question"
Setting row names on a tibble is deprecated.

Here’s a sample of what this new dataset looks like (5 of the 59 columns):

Please specify format in kable. kableExtra can customize either HTML or LaTeX outputs. See https://haozhu233.github.io/kableExtra/ for details.

Site 10. I have distinct memories of having lived a different life, in a different time and place. 11. I have perceived or interacted with what seemed to be a world or reality other than the one I usually inhabit. 12. I have had the experience of being aware that I was dreaming while asleep. 13. I have sensed the presence of what seemed to be non-ordinary forces or entities. 14. I have had an experience in which the meaning and purpose of my life suddenly became clear to me.
US 0.0961538 0.0776699 0.6310680 0.2549020 0.2788462
Ghana 0.4409449 0.3360000 0.6220472 0.3840000 0.4765625
Thailand 0.0952381 0.0769231 0.8190476 0.2380952 0.4761905
China 0.1279070 0.2808989 0.8395062 0.2159091 0.5308642
Vanuatu 0.6000000 0.3789474 0.7608696 0.3541667 0.8210526

Hierarchical clustering

My first instinct was to try hierarchical clustering on this new dataset. Each question is associated with 5 prevalences (one for each of our 5 fieldsites). In this cluster analysis, we’re looking for questions that share similar patterns of prevalence across the fieldsites - e.g., one cluster might identify a set questions where the prevalence is roughly the same across the 5 sites; another cluster might identify a set of questions where the prevalence is high in Ghana and Vanuatu but low everywhere else; etc. I think this captures some of the spirit of what Ann was after today (10/8)… though maybe not everything (e.g., it might not differentiate between questions where prevalence is high across the 5 sites vs. questions where prevalence is low across the 5 sites).

After some playing around with this, I’m going to extract 9 clusters here - I’ve colored them according such above. This is a subjective call - you could extract more or fewer. I think this seems kind of reasonable eyeballing the plot above.

Joining, by = "question_text"
Joining, by = "question"

Cluster 1

Here I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 1. (Note that the order of clusters doesn’t align with the top to bottom order of the previous plot - sorry if that’s confusing, it’s just an artifact of how the previous plot worked. Not very meaningful. This is the light orange cluster above.)

I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is low in the US and Thailand (~25%), slightly higher in China (but under 50%), and higher in Ghana and Vanuatu (generally over 50%).

I won’t try to interpret the meaning of these questions right now.

Cluster 2

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 2 (the pink cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is something like very low in the US (generally < 10%), pretty low in Thailand and China (generally < 25%), middling in Ghana (around 25%), and moderate in Vanuatu (under 50%). But there are some exceptions here - e.g., #26 (where Thailand is highest); #47 and #39 (where all sites are comparable); #51 (where Ghana, Thailand, and China are all comparable). I would say that these questions are less good examples of this “cluster.”

Cluster 3

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 3 (the dark red cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally low (~25%) across the board, but slightly higher in Ghana and Vanuatu (closer to 40%).

Cluster 4

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 4 (the light blue cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally comparable and pretty high (~75%) across the board, especially in China and Thailand.

Cluster 5

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 5 (the dark orange cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally comparable and moderate (~25%) across the board, but higher in Ghana and Vanuatu (closer to 50%).

Cluster 6

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 6 (the dark green cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally comparable and moderate (~25%) in the US and Thailand, but higher in Ghana, China, and especially Vanuatu (>50%).

Cluster 7

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 7 (the dark blue cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally moderate (~25%) in the US and Thailand, higher in Ghana and Vanuatu (~50%), and especially high in China (~60%).

Cluster 8

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 8 (the light purple cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally moderate (~25%) across the board, maybe a little higher in China and Vanuatu (closer to 40%).

Cluster 9

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 9 (the light green cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally high (~50%) across the board, and espcially in China (closer to 70%).

Hierarchical clustering pretending we only had 2 sites (US and Ghana)

Here I will try to approximate what it would be like to do this analysis with only 2 sites, to give a sense of whether this would make sense for the 1.0 data. I’ll limit the data to only 2 sites (US and Ghana) and do everything I did before.

Setting row names on a tibble is deprecated.

Here, 8 seems like a reasonable number of clusters to look at. I wish that the light orange cluster weren’t a cluster of 1, but it requires going down to just 5 clusters to get there, which means that the other clusters get quite large.

Joining, by = "question_text"
Joining, by = "question"

Cluster 1

Following the 5-site analysis above, here I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 1. (This is the pink cluster above.)

I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is moderate in the US (>25%) and higher in Ghana (close to 50%).

Cluster 2

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 2 (the light green cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is low in the US (<10%) and moderate in Ghana (~25%).

Cluster 3

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 3 (the dark green cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is relatively high across the board (>50%).

Cluster 4

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 4 (the dark blue cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally moderate across the two sites (~25%), slightly higher in Ghana (~40%).

Cluster 5

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 5 (the dark red cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is generally comparable and moderate (close to 50%) across the board - if anything, perhaps a little higher in the US on a couple of items.

Cluster 6

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 6 (the light blue cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is very low in the US (<10%) and slightly higher in Ghana (~20%).

Cluster 7

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 7 (the dark orange cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

It looks like the prevalence pattern here is fairly low in the US (<25%) and high in Ghana (>50%).

Cluster 8

Now I’ll plot the prevalence of endorsements in each site for each of the questions in Cluster 8 (the other half of the dark green cluster in the overall plot).

Again, I’ll plot these questions in descending order of their prevalence in the US sample, just as a point of reference.

This is one item and it happens to be moderate inthe US and high in Ghana. I wouldn’t make much of this factor.

Testing predictions

These are predictions we articulated as a group on 2018-12-10

Clusters 6794 are more common than the others

Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: binomial  ( logit )
Formula: prev ~ level1 + (1 | question) + (1 | taves_ctry)
   Data: hclust_df_grouped
Weights: n

     AIC      BIC   logLik deviance df.resid 
  2922.3   2937.1  -1457.2   2914.3      291 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-5.3522 -1.3453 -0.1095  1.2750  5.9963 

Random effects:
 Groups     Name        Variance Std.Dev.
 question   (Intercept) 0.1546   0.3932  
 taves_ctry (Intercept) 0.1483   0.3851  
Number of obs: 295, groups:  question, 59; taves_ctry, 5

Fixed effects:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept)  -0.8383     0.1833  -4.574 4.77e-06 ***
level16794    1.0809     0.1163   9.297  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
           (Intr)
level16794 -0.184

Yes, this prediction is upheld (both in the aggregate and looking at each site individually).

Clusters 679 appraised as religious more frequently than cluster 4

Joining, by = "taves_subj"
Joining, by = "question"
Linear mixed model fit by REML ['lmerMod']
Formula: 
appraisal ~ level2common + (1 | question) + (1 | taves_ctry/taves_subj)
   Data: d_appraisal_num2 %>% filter(!is.na(appraisal))

REML criterion at convergence: 11413.6

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.5831 -0.6775 -0.1177  0.6578  2.7814 

Random effects:
 Groups                Name        Variance Std.Dev.
 taves_subj:taves_ctry (Intercept) 0.16494  0.4061  
 question              (Intercept) 0.01407  0.1186  
 taves_ctry            (Intercept) 0.06927  0.2632  
 Residual                          0.46034  0.6785  
Number of obs: 5141, groups:  
taves_subj:taves_ctry, 521; question, 17; taves_ctry, 5

Fixed effects:
              Estimate Std. Error t value
(Intercept)   -0.20296    0.12379  -1.640
level2common4 -0.08811    0.07898  -1.116

Correlation of Fixed Effects:
            (Intr)
level2cmmn4 -0.116

The results for this prediction are mixed. It is not upheld in the aggregate, but seems to be true in the US, and possibly in Ghana and Vanuatu (i.e., Christian countries?).

Clusters 679 will be marked as positive/negative rather than cluster 4 (?)

Joining, by = "taves_subj"
Joining, by = "question"
Linear mixed model fit by REML ['lmerMod']
Formula: 
abs(valence) ~ level2common + (1 | question) + (1 | taves_ctry/taves_subj)
   Data: d_valence_num2 %>% filter(!is.na(valence))

REML criterion at convergence: 6562.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.1912 -0.9412  0.3295  0.8207  2.2519 

Random effects:
 Groups                Name        Variance Std.Dev.
 taves_subj:taves_ctry (Intercept) 0.027980 0.1673  
 question              (Intercept) 0.014461 0.1203  
 taves_ctry            (Intercept) 0.004901 0.0700  
 Residual                          0.192904 0.4392  
Number of obs: 5077, groups:  
taves_subj:taves_ctry, 521; question, 17; taves_ctry, 5

Fixed effects:
              Estimate Std. Error t value
(Intercept)    0.60997    0.04609  13.233
level2common4 -0.16528    0.07799  -2.119

Correlation of Fixed Effects:
            (Intr)
level2cmmn4 -0.302

Yes, this prediction is upheld (both in the aggregate and looking at each site individually, with the possible exception of Vanuatu).

Cluster 69 will be more positive than cluster 7

Linear mixed model fit by REML ['lmerMod']
Formula: valence ~ level3 + (1 | question) + (1 | taves_ctry/taves_subj)
   Data: d_valence_num2 %>% filter(!is.na(valence))

REML criterion at convergence: 7968.2

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.78548 -0.68151  0.06094  0.73060  2.99054 

Random effects:
 Groups                Name        Variance Std.Dev.
 taves_subj:taves_ctry (Intercept) 0.049447 0.22237 
 question              (Intercept) 0.104683 0.32355 
 taves_ctry            (Intercept) 0.003939 0.06276 
 Residual                          0.398107 0.63096 
Number of obs: 3949, groups:  
taves_subj:taves_ctry, 513; question, 14; taves_ctry, 5

Fixed effects:
            Estimate Std. Error t value
(Intercept) -0.02973    0.12683  -0.234
level369     0.42330    0.17416   2.431

Correlation of Fixed Effects:
         (Intr)
level369 -0.688

Yes, this prediction is clearly upheld (both in the aggregate and looking at each site individually).

Clusters 679 appraised as more significant than 4

Joining, by = "taves_subj"
Joining, by = "question"
Linear mixed model fit by REML ['lmerMod']
Formula: 
significance ~ level2common + (1 | question) + (1 | taves_ctry/taves_subj)
   Data: d_significance_num2 %>% filter(!is.na(significance))

REML criterion at convergence: 3586.9

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-3.02179 -0.65557  0.03006  0.74054  2.54980 

Random effects:
 Groups                Name        Variance Std.Dev.
 taves_subj:taves_ctry (Intercept) 0.032477 0.18021 
 question              (Intercept) 0.006291 0.07932 
 taves_ctry            (Intercept) 0.001747 0.04179 
 Residual                          0.102079 0.31950 
Number of obs: 5075, groups:  
taves_subj:taves_ctry, 520; question, 17; taves_ctry, 5

Fixed effects:
              Estimate Std. Error t value
(Intercept)    0.59594    0.02989  19.936
level2common4 -0.12958    0.05166  -2.508

Correlation of Fixed Effects:
            (Intr)
level2cmmn4 -0.310

Yes, this prediction is upheld (both in the aggregate and looking at each site individually).

Clusters 851 more common than clusters 32

Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: binomial  ( logit )
Formula: prev ~ level2uncommon + (1 | question) + (1 | taves_ctry)
   Data: hclust_df_grouped
Weights: n

     AIC      BIC   logLik deviance df.resid 
  1791.0   1804.4   -891.5   1783.0      206 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-3.8760 -1.3721 -0.1709  1.0627  4.8106 

Random effects:
 Groups     Name        Variance Std.Dev.
 question   (Intercept) 0.05679  0.2383  
 taves_ctry (Intercept) 0.20677  0.4547  
Number of obs: 210, groups:  question, 42; taves_ctry, 5

Fixed effects:
                  Estimate Std. Error z value Pr(>|z|)    
(Intercept)       -1.30327    0.21510  -6.059 1.37e-09 ***
level2uncommon851  0.66649    0.08514   7.828 4.97e-15 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
lvl2ncmm851 -0.268

Yes, this prediction is upheld (both in the aggregate and looking at each site individually, with the probable exception of Vanuatu).

Clusters 8 to 5 to 1: increases in divergence between countries


    Bartlett test of homogeneity of variances

data:  mean_prev by cluster
Bartlett's K-squared = 2.7809, df = 2, p-value = 0.249


    Bartlett test of homogeneity of variances

data:  mean_prev by cluster
Bartlett's K-squared = 0.61953, df = 1, p-value = 0.4312


    Bartlett test of homogeneity of variances

data:  mean_prev by cluster
Bartlett's K-squared = 0.83052, df = 1, p-value = 0.3621

This prediction looks like it’s upheld according to the plot (dots for each site are closest together for cluster 8 and most scattered for cluster 1). It doesn’t come out as significant in a formal test of the variability across the five sites for each cluster, but I’m not sure whether I’d expect that to come out or not, given the sample size (n = 5 sites). (Genuinely not sure!)

Clusters 8 to 5 to 1: decreases in frequency

Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: binomial  ( logit )
Formula: prev ~ cluster + (1 | question) + (1 | taves_ctry)
   Data: hclust_df_grouped %>% filter(cluster %in% c("1", "5", "8")) %>%  
    mutate(cluster = factor(cluster, levels = c("8", "5", "1")))
Weights: n

     AIC      BIC   logLik deviance df.resid 
  1134.8   1149.5   -562.4   1124.8      135 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.2572 -1.0490  0.0215  0.9268  4.3298 

Random effects:
 Groups     Name        Variance Std.Dev.
 question   (Intercept) 0.00329  0.05736 
 taves_ctry (Intercept) 0.14749  0.38405 
Number of obs: 140, groups:  question, 28; taves_ctry, 5

Fixed effects:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -0.66146    0.17311  -3.821 0.000133 ***
cluster.L    0.14281    0.03528   4.047 5.18e-05 ***
cluster.Q    0.33253    0.03879   8.573  < 2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
          (Intr) clst.L
cluster.L -0.021       
cluster.Q -0.016 -0.113

No, this prediction is not upheld (either in the aggregate or looking at each site individually, with the possible exception of Thailand). If anything, cluster 1 generally seems to be the most common of these three clusters.

Clusters 32: GH and VT stand out for their endorsement

Generalized linear mixed model fit by maximum likelihood (Laplace
  Approximation) [glmerMod]
 Family: binomial  ( logit )
Formula: prev ~ level2uncommon * taves_ctry + (1 | question)
   Data: 
hclust_df_grouped %>% filter(!is.na(level2uncommon)) %>% mutate(taves_ctry = factor(taves_ctry,  
    levels = c("US", "Ghana", "Thailand", "China", "Vanuatu")))
Weights: n

     AIC      BIC   logLik deviance df.resid 
  1713.7   1750.5   -845.8   1691.7      199 

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-4.0518 -1.1072 -0.1083  1.1510  4.9969 

Random effects:
 Groups   Name        Variance Std.Dev.
 question (Intercept) 0.0558   0.2362  
Number of obs: 210, groups:  question, 42

Fixed effects:
                                      Estimate Std. Error z value Pr(>|z|)    
(Intercept)                           -1.35863    0.07055 -19.258  < 2e-16 ***
level2uncommon851                      0.73052    0.08542   8.552  < 2e-16 ***
taves_ctryUS_other                    -0.18649    0.01800 -10.359  < 2e-16 ***
taves_ctryGHVT_THCH                    0.53321    0.03293  16.193  < 2e-16 ***
taves_ctryGH_VT                       -0.30629    0.03869  -7.917 2.43e-15 ***
taves_ctryTH_CH                        0.07194    0.05326   1.351  0.17682    
level2uncommon851:taves_ctryUS_other   0.05719    0.02039   2.805  0.00503 ** 
level2uncommon851:taves_ctryGHVT_THCH -0.25031    0.03843  -6.514 7.34e-11 ***
level2uncommon851:taves_ctryGH_VT      0.13824    0.04666   2.963  0.00305 ** 
level2uncommon851:taves_ctryTH_CH      0.05896    0.06104   0.966  0.33407    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) lv2851 tv_US_ t_GHVT t_GH_V t_TH_C l2851:_U l2851:_GHV
lvl2ncmm851 -0.826                                                       
tvs_ctryUS_  0.086 -0.071                                                
t_GHVT_THCH -0.117  0.097  0.112                                         
tvs_ctGH_VT -0.012  0.010  0.013 -0.035                                  
tvs_ctTH_CH  0.010 -0.008 -0.010 -0.026  0.000                           
lv2851:_US_ -0.076  0.070 -0.883 -0.099 -0.012  0.009                    
l2851:_GHVT  0.100 -0.096 -0.096 -0.857  0.030  0.023  0.098             
l2851:_GH_V  0.010 -0.016 -0.011  0.029 -0.829  0.000  0.018   -0.049    
l2851:_TH_C -0.008  0.010  0.009  0.023  0.000 -0.873 -0.011   -0.029    
            l2851:_GH_
lvl2ncmm851           
tvs_ctryUS_           
t_GHVT_THCH           
tvs_ctGH_VT           
tvs_ctTH_CH           
lv2851:_US_           
l2851:_GHVT           
l2851:_GH_V           
l2851:_TH_C  0.000    

Yes, this prediction is upheld, but rather weakly: Ghana and Vanuatu stand out in both clusters 32 and clusters 851, but they stand out a little more (gap between them and other countries is a little bigger) in clusters 32.

Overall summaries of prevalence, appraisal, valence, & significance

LS0tCnRpdGxlOiAiS1cgbG9va2luZyBhdCBwYXR0ZXJucyBvZiBwcmV2YWxlbmNlIgpkYXRlOiAyMDE4LTEwLTA4Cm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCi0tLQoKVGhpcyBpcyBLYXJhJ3MgYXR0ZW1wdCB0byB0aGluayBhYm91dCBwYXR0ZXJucyBvZiBwcmV2YWxlbmNlIGFjcm9zcyBzaXRlczogV2hhdCBwcm9wb3J0aW9uIG9mIHBhcnRpY2lwYW50cyBpbiBlYWNoIHNpdGUgZW5kb3JzZWQgZWFjaCBxdWVzdGlvbiwgYW5kIGNhbiB3ZSBmaW5kICJjbHVzdGVycyIgb2YgcXVlc3Rpb25zIHRoYXQgd2VyZSBlaXRoZXIgc2ltaWxhciBpbiBwcmV2YWxlbmNlIGFjcm9zcyBzaXRlcyBvciBkaWZmZXJlbmNlIGFjcm9zcyBzaXRlcyBpbiB2YXJpb3VzIHdheXM/CgpUaGlzIGlzIGluc3BpcmVkIGJ5IEFubidzIGlkZWFzIG9uIDIwMTgtMTAtMDgsIGJ1dCB1c2VzIGEgc29tZXdoYXQgZGlmZmVyZW50IHN0cmF0ZWd5LgoKKipVcGRhdGUgMjAxOC0xMi0xNyoqOiBOb3cgaW5jbHVkaW5nIHRlc3RzIG9mIGh5cG90aGVzZXMgZnJvbSBvdXIgbWVldGluZyBvbiAyMDE4LTEyLTEwLgoKYGBge3IgZ2xvYmFsX29wdGlvbnMsIGluY2x1ZGUgPSBGfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobz1GLCB3YXJuaW5nPUYsIGNhY2hlPUYsIG1lc3NhZ2U9RikKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShwc3ljaCkKbGlicmFyeShmYWN0b2V4dHJhKQpsaWJyYXJ5KGdnZGVuZHJvKQpsaWJyYXJ5KGRlbmRleHRlbmQpCmxpYnJhcnkobG1lNCkKbGlicmFyeShsYW5nY29nKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KZDAgPC0gcmVhZF9leGNlbCgiL1VzZXJzL2t3ZWlzbWFuL0RvY3VtZW50cy9SZXNlYXJjaCAoU3RhbmZvcmQpL1Byb2plY3RzL1RlbXBsZXRvbiBHcmFudC9EQVRBIFdSQU5HTElORy9UYXZlcy9kYXRhL1RhdmVzX2Z1bGxfZGF0YXNldC54bHN4Iiwgc2hlZXQgPSA1KVstMSxdICMgcmVtb3ZlIHF1ZXN0aW9uIHRleHQKCnF1ZXN0aW9uX2tleSA8LSByZWFkX2V4Y2VsKCIvVXNlcnMva3dlaXNtYW4vRG9jdW1lbnRzL1Jlc2VhcmNoIChTdGFuZm9yZCkvUHJvamVjdHMvVGVtcGxldG9uIEdyYW50L0RBVEEgV1JBTkdMSU5HL1RhdmVzL2RhdGEvVGF2ZXNfZnVsbF9kYXRhc2V0Lnhsc3giLCBzaGVldCA9IDMpWywxOjVdICMgb25seSByZWxldmFudCBjb2x1bW5zCgpuX2l0ZXIgPC0gNTAwMApgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KZF9iYXNlIDwtIGQwICU+JQogIGRhdGEuZnJhbWUoKSAlPiUKICBzZWxlY3QodGF2ZXNfc3ViaiwgdGF2ZXNfMDE6dGF2ZXNfNjBlKSAlPiUKICBzZWxlY3QoLWVuZHNfd2l0aCgiYSIpLCAtZW5kc193aXRoKCJiIiksIC1lbmRzX3dpdGgoImMiKSwgCiAgICAgICAgIC1lbmRzX3dpdGgoImQiKSwgLWVuZHNfd2l0aCgiZSIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGZpbHRlcih0YXZlc19zdWJqICE9ICI0MDU0OCIpICU+JSAjIHJlbW92ZSBvbmUgZHVwbGljYXRlCiAgIyBjb2x1bW5fdG9fcm93bmFtZXMoInRhdmVzX3N1YmoiKSAlPiUKICBtdXRhdGVfYXQodmFycygtdGF2ZXNfc3ViaiksCiAgICAgICAgICAgIGZ1bnMoZmFjdG9yKHRvbG93ZXIoLiksIGxldmVscyA9IGMoIm5vIiwgInllcyIpKSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKC10YXZlc19zdWJqKSwKICAgICAgICAgICAgZnVucyhudW0gPSBhcy5udW1lcmljKC4pIC0gMSkpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygidGF2ZXNfc3ViaiIpICU+JQogIHNlbGVjdCgtc3RhcnRzX3dpdGgoInRhdmVzXzUzIikpCgpkX2Jhc2VfbnVtIDwtIGRfYmFzZSAlPiUKICBzZWxlY3QoZW5kc193aXRoKCJfbnVtIikpCmBgYAoKTm90ZXM6IHBlciBvdXIgY29udmVyc2F0aW9uIHdpdGggTmlra2ksIHdlIGFyZSBkcm9wcGluZyBvbmUgcXVlc3Rpb24gKCM1MyksIHdoaWNoIHdhcyBhIHJlcGVhdGVkIHF1ZXN0aW9uIGluIGFsbCBzaXRlcyBleGNlcHQgZm9yIENoaW5hLgoKYGBge3IsIGluY2x1ZGUgPSBGfQpkX2FwcHJhaXNhbCA8LSBkMCAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgc2VsZWN0KHRhdmVzX3N1YmosIHRhdmVzXzAxOnRhdmVzXzYwZSkgJT4lCiAgc2VsZWN0KHRhdmVzX3N1YmosIGVuZHNfd2l0aCgiYiIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGZpbHRlcih0YXZlc19zdWJqICE9ICI0MDU0OCIpICU+JSAjIHJlbW92ZSBvbmUgZHVwbGljYXRlCiAgIyBjb2x1bW5fdG9fcm93bmFtZXMoInRhdmVzX3N1YmoiKSAlPiUKICBtdXRhdGVfYXQodmFycygtdGF2ZXNfc3ViaiksCiAgICAgICAgICAgIGZ1bnMoZmFjdG9yKHRvbG93ZXIoLiksIGxldmVscyA9IGMoIm5vIiwgInVuc3VyZSIsICJ5ZXMiKSkpKSAlPiUKICBtdXRhdGVfYXQodmFycygtdGF2ZXNfc3ViaiksCiAgICAgICAgICAgIGZ1bnMobnVtID0gYXMubnVtZXJpYyguKSAtIDIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInRhdmVzX3N1YmoiKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0YXZlc181MyIpKQoKZF9hcHByYWlzYWxfbnVtIDwtIGRfYXBwcmFpc2FsICU+JQogIHNlbGVjdChlbmRzX3dpdGgoIl9udW0iKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmRfdmFsZW5jZSA8LSBkMCAlPiUKICBkYXRhLmZyYW1lKCkgJT4lCiAgc2VsZWN0KHRhdmVzX3N1YmosIHRhdmVzXzAxOnRhdmVzXzYwZSkgJT4lCiAgc2VsZWN0KHRhdmVzX3N1YmosIGVuZHNfd2l0aCgiZCIpKSAlPiUKICBkaXN0aW5jdCgpICU+JQogIGZpbHRlcih0YXZlc19zdWJqICE9ICI0MDU0OCIpICU+JSAjIHJlbW92ZSBvbmUgZHVwbGljYXRlCiAgIyBjb2x1bW5fdG9fcm93bmFtZXMoInRhdmVzX3N1YmoiKSAlPiUKICBtdXRhdGVfYXQodmFycygtdGF2ZXNfc3ViaiksCiAgICAgICAgICAgIGZ1bnMoZmFjdG9yKHRvbG93ZXIoLiksIGxldmVscyA9IGMoInNvbWV3aGF0IG5lZ2F0aXZlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFib3V0IG5ldXRyYWwiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29tZXdoYXQgcG9zaXRpdmUiKSkpKSAlPiUKICBtdXRhdGVfYXQodmFycygtdGF2ZXNfc3ViaiksCiAgICAgICAgICAgIGZ1bnMobnVtID0gYXMubnVtZXJpYyguKSAtIDIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInRhdmVzX3N1YmoiKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0YXZlc181MyIpKQoKZF92YWxlbmNlX251bSA8LSBkX3ZhbGVuY2UgJT4lCiAgc2VsZWN0KGVuZHNfd2l0aCgiX251bSIpKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KZF9zaWduaWZpY2FuY2UgPC0gZDAgJT4lCiAgZGF0YS5mcmFtZSgpICU+JQogIHNlbGVjdCh0YXZlc19zdWJqLCB0YXZlc18wMTp0YXZlc182MGUpICU+JQogIHNlbGVjdCh0YXZlc19zdWJqLCBlbmRzX3dpdGgoImUiKSkgJT4lCiAgZGlzdGluY3QoKSAlPiUKICBmaWx0ZXIodGF2ZXNfc3ViaiAhPSAiNDA1NDgiKSAlPiUgIyByZW1vdmUgb25lIGR1cGxpY2F0ZQogICMgY29sdW1uX3RvX3Jvd25hbWVzKCJ0YXZlc19zdWJqIikgJT4lCiAgbXV0YXRlX2F0KHZhcnMoLXRhdmVzX3N1YmopLAogICAgICAgICAgICBmdW5zKGZhY3Rvcih0b2xvd2VyKC4pLCBsZXZlbHMgPSBjKCJub3Qgc2lnbmlmaWNhbnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic29tZXdoYXQgc2lnbmlmaWNhbnQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmVyeSBzaWduaWZpY2FudCIpKSkpICU+JQogIG11dGF0ZV9hdCh2YXJzKC10YXZlc19zdWJqKSwKICAgICAgICAgICAgZnVucyhudW0gPSAoYXMubnVtZXJpYyguKSAtIDEpLzIpKSAlPiUKICBjb2x1bW5fdG9fcm93bmFtZXMoInRhdmVzX3N1YmoiKSAlPiUKICBzZWxlY3QoLXN0YXJ0c193aXRoKCJ0YXZlc181MyIpKQoKZF9zaWduaWZpY2FuY2VfbnVtIDwtIGRfc2lnbmlmaWNhbmNlICU+JQogIHNlbGVjdChlbmRzX3dpdGgoIl9udW0iKSkKYGBgCgojIE1ha2UgbmV3IGRhdGFzZXQKCkZpcnN0LCBJJ20gZ29pbmcgdG8gbWFrZSBhIG5ldyBkYXRhc2V0IHdoZXJlLCBmb3IgZWFjaCBxdWVzdGlvbiwgd2UgaGF2ZSB0aGUgcHJvcG9ydGlvbiBvZiB5ZXMgcmVwb25zZXMgZnJvbSBlYWNoIG9mIHRoZSBmaXZlIGZpZWxkIHNpdGVzLgoKYGBge3J9CmRfcHJldiA8LSBkX2Jhc2VfbnVtICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigidGF2ZXNfc3ViaiIpICU+JQogIGdhdGhlcihxdWVzdGlvbiwgcmVzcG9uc2UsIC10YXZlc19zdWJqKSAlPiUKICBsZWZ0X2pvaW4oZDAgJT4lIGRpc3RpbmN0KHRhdmVzX3N1YmosIHRhdmVzX2N0cnkpKSAlPiUKICBncm91cF9ieSh0YXZlc19jdHJ5LCBxdWVzdGlvbikgJT4lCiAgc3VtbWFyaXNlKHByZXYgPSBtZWFuKHJlc3BvbnNlLCBuYS5ybSA9IFQpKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiX251bSIsICIiLCBxdWVzdGlvbikpICU+JQogIGxlZnRfam9pbihxdWVzdGlvbl9rZXkgJT4lCiAgICAgICAgICAgICAgcmVuYW1lKHF1ZXN0aW9uID0gYFZhcmlhYmxlIE5hbWUgLSBWRVJTSU9OIDEgLS0gYWxsIHZhcmlhYmxlcyBpbiB2ZXJzaW9uMiBoYXZlIGJlZW4gcmVuYW1lZCB0byByZWZsZWN0IHRoZXNlIHZhcmFpYmxlIG5hbWVzYCwKICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25fdGV4dCA9IGBRdWVzdGlvbiAtIFZFUlNJT04gMWApKSAlPiUKICBzZWxlY3QodGF2ZXNfY3RyeSwgcXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQsIHByZXYpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YigiXHIiLCAiICIsIHF1ZXN0aW9uX3RleHQpLAogICAgICAgICBxdWVzdGlvbl90ZXh0ID0gZ3N1YigiXG4iLCAiICIsIHF1ZXN0aW9uX3RleHQpLAogICAgICAgICBxdWVzdGlvbl90ZXh0ID0gZ3N1YigiICAiLCAiICIsIHF1ZXN0aW9uX3RleHQpLAogICAgICAgICBxdWVzdGlvbl90ZXh0ID0gZ3N1Yigi4oCaw4TDtCIsICInIiwgcXVlc3Rpb25fdGV4dCksCiAgICAgICAgIHF1ZXN0aW9uX3RleHQgPSBnc3ViKCLigJrDhMO6IiwgIiciLCBxdWVzdGlvbl90ZXh0KSwKICAgICAgICAgcXVlc3Rpb25fdGV4dCA9IGdzdWIoIuKAmsOEw7kiLCAiJyIsIHF1ZXN0aW9uX3RleHQpLAogICAgICAgICB0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKQoKCmRfcHJldl93aWRlIDwtIGRfcHJldiAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBmYWN0b3IocXVlc3Rpb24pKSAlPiUKICBhcnJhbmdlKHF1ZXN0aW9uKSAlPiUKICBzZWxlY3QoLXF1ZXN0aW9uKSAlPiUKICBzcHJlYWQocXVlc3Rpb25fdGV4dCwgcHJldikgJT4lCiAgbXV0YXRlKHRhdmVzX2N0cnkgPSBhcy5jaGFyYWN0ZXIodGF2ZXNfY3RyeSkpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygidGF2ZXNfY3RyeSIpCmBgYAoKSGVyZSdzIGEgc2FtcGxlIG9mIHdoYXQgdGhpcyBuZXcgZGF0YXNldCBsb29rcyBsaWtlICg1IG9mIHRoZSA1OSBjb2x1bW5zKToKCmBgYHtyLCByZXN1bHRzID0gImFzaXMifQpkX3ByZXZfd2lkZSAlPiUgCiAgc2VsZWN0KDI6NikgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigiU2l0ZSIpICU+JSAKICBrbml0cjo6a2FibGUoKSAlPiUgCiAga2FibGVFeHRyYTo6a2FibGVfc3R5bGluZygpCmBgYAoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyBIaWVyYXJjaGljYWwgY2x1c3RlcmluZwoKTXkgZmlyc3QgaW5zdGluY3Qgd2FzIHRvIHRyeSBoaWVyYXJjaGljYWwgY2x1c3RlcmluZyBvbiB0aGlzIG5ldyBkYXRhc2V0LiBFYWNoIHF1ZXN0aW9uIGlzIGFzc29jaWF0ZWQgd2l0aCA1IHByZXZhbGVuY2VzIChvbmUgZm9yIGVhY2ggb2Ygb3VyIDUgZmllbGRzaXRlcykuIEluIHRoaXMgY2x1c3RlciBhbmFseXNpcywgd2UncmUgbG9va2luZyBmb3IgcXVlc3Rpb25zIHRoYXQgc2hhcmUgc2ltaWxhciBwYXR0ZXJucyBvZiBwcmV2YWxlbmNlIGFjcm9zcyB0aGUgZmllbGRzaXRlcyAtIGUuZy4sIG9uZSBjbHVzdGVyIG1pZ2h0IGlkZW50aWZ5IGEgc2V0IHF1ZXN0aW9ucyB3aGVyZSB0aGUgcHJldmFsZW5jZSBpcyByb3VnaGx5IHRoZSBzYW1lIGFjcm9zcyB0aGUgNSBzaXRlczsgYW5vdGhlciBjbHVzdGVyIG1pZ2h0IGlkZW50aWZ5IGEgc2V0IG9mIHF1ZXN0aW9ucyB3aGVyZSB0aGUgcHJldmFsZW5jZSBpcyBoaWdoIGluIEdoYW5hIGFuZCBWYW51YXR1IGJ1dCBsb3cgZXZlcnl3aGVyZSBlbHNlOyBldGMuIEkgdGhpbmsgdGhpcyBjYXB0dXJlcyBzb21lIG9mIHRoZSBzcGlyaXQgb2Ygd2hhdCBBbm4gd2FzIGFmdGVyIHRvZGF5ICgxMC84KS4uLiB0aG91Z2ggbWF5YmUgbm90IGV2ZXJ5dGhpbmcgKGUuZy4sIGl0IG1pZ2h0IG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcXVlc3Rpb25zIHdoZXJlIHByZXZhbGVuY2UgaXMgaGlnaCBhY3Jvc3MgdGhlIDUgc2l0ZXMgdnMuIHF1ZXN0aW9ucyB3aGVyZSBwcmV2YWxlbmNlIGlzIGxvdyBhY3Jvc3MgdGhlIDUgc2l0ZXMpLgoKYGBge3J9CmhjbHVzdF9wcmV2IDwtIGRfcHJldl93aWRlICU+JSAKICB0KCkgJT4lIAogIGRpc3QoKSAlPiUgCiAgaGNsdXN0KCkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gOCwgZmlnLmFzcCA9IDF9CmhjbHVzdF9wcmV2ICU+JSAKICBhcy5kZW5kcm9ncmFtKCkgJT4lIAogIHNldCgibGFiZWxzX2NvbCIsIGsgPSA5LCB2YWx1ZSA9IGMoIiNhNmNlZTMiLCAiIzFmNzhiNCIsICIjYjJkZjhhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjMzNhMDJjIiwgIiNmYjlhOTkiLCAiI2UzMWExYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNmZGJmNmYiLCAiI2ZmN2YwMCIsICIjY2FiMmQ2IikpICU+JSAKICBwbG90KGhvcml6ID0gVCwgeGxpbSA9IGMoMS41LCAtMTIpLCBheGVzID0gRikKYGBgCgpBZnRlciBzb21lIHBsYXlpbmcgYXJvdW5kIHdpdGggdGhpcywgSSdtIGdvaW5nIHRvIGV4dHJhY3QgOSBjbHVzdGVycyBoZXJlIC0gSSd2ZSBjb2xvcmVkIHRoZW0gYWNjb3JkaW5nIHN1Y2ggYWJvdmUuIFRoaXMgaXMgYSBzdWJqZWN0aXZlIGNhbGwgLSB5b3UgY291bGQgZXh0cmFjdCBtb3JlIG9yIGZld2VyLiBJIHRoaW5rIHRoaXMgc2VlbXMga2luZCBvZiByZWFzb25hYmxlIGV5ZWJhbGxpbmcgdGhlIHBsb3QgYWJvdmUuCgpgYGB7cn0KaGNsdXN0X2RmIDwtIGRhdGEuZnJhbWUoY2x1c3RlciA9IGN1dHJlZShoY2x1c3RfcHJldiwgOSkpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigicXVlc3Rpb25fdGV4dCIpICU+JQogIGZ1bGxfam9pbihkX3ByZXYpICU+JQogIGxlZnRfam9pbihkX3ByZXYgJT4lIAogICAgICAgICAgICAgIGZpbHRlcih0YXZlc19jdHJ5ID09ICJVUyIpICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChxdWVzdGlvbiwgcHJldikgJT4lIAogICAgICAgICAgICAgIHJlbmFtZSgiVVNfcHJldiIgPSAicHJldiIpKSAlPiUKICBhcnJhbmdlKGNsdXN0ZXIsIGRlc2MoVVNfcHJldiksIHRhdmVzX2N0cnkpCmBgYAoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDEKCkhlcmUgSSdsbCBwbG90IHRoZSBwcmV2YWxlbmNlIG9mIGVuZG9yc2VtZW50cyBpbiBlYWNoIHNpdGUgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9ucyBpbiBDbHVzdGVyIDEuIChOb3RlIHRoYXQgdGhlIG9yZGVyIG9mIGNsdXN0ZXJzIGRvZXNuJ3QgYWxpZ24gd2l0aCB0aGUgdG9wIHRvIGJvdHRvbSBvcmRlciBvZiB0aGUgcHJldmlvdXMgcGxvdCAtIHNvcnJ5IGlmIHRoYXQncyBjb25mdXNpbmcsIGl0J3MganVzdCBhbiBhcnRpZmFjdCBvZiBob3cgdGhlIHByZXZpb3VzIHBsb3Qgd29ya2VkLiBOb3QgdmVyeSBtZWFuaW5nZnVsLiBUaGlzIGlzIHRoZSBsaWdodCBvcmFuZ2UgY2x1c3RlciBhYm92ZS4pCgpJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQpoY2x1c3RfZGYgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gMSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiAxIiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgbG93IGluIHRoZSBVUyBhbmQgVGhhaWxhbmQgKH4yNSUpLCBzbGlnaHRseSBoaWdoZXIgaW4gQ2hpbmEgKGJ1dCB1bmRlciA1MCUpLCBhbmQgaGlnaGVyIGluIEdoYW5hIGFuZCBWYW51YXR1IChnZW5lcmFsbHkgb3ZlciA1MCUpLgoKSSB3b24ndCB0cnkgdG8gaW50ZXJwcmV0IHRoZSBtZWFuaW5nIG9mIHRoZXNlIHF1ZXN0aW9ucyByaWdodCBub3cuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDIKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgMiAodGhlIHBpbmsgY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjV9CmhjbHVzdF9kZiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSAyKSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDIiLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBwcmV2YWxlbmNlIHBhdHRlcm4gaGVyZSBpcyBzb21ldGhpbmcgbGlrZSB2ZXJ5IGxvdyBpbiB0aGUgVVMgKGdlbmVyYWxseSA8IDEwJSksIHByZXR0eSBsb3cgaW4gVGhhaWxhbmQgYW5kIENoaW5hIChnZW5lcmFsbHkgPCAyNSUpLCBtaWRkbGluZyBpbiBHaGFuYSAoYXJvdW5kIDI1JSksIGFuZCBtb2RlcmF0ZSBpbiBWYW51YXR1ICh1bmRlciA1MCUpLiBCdXQgdGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucyBoZXJlIC0gZS5nLiwgIzI2ICh3aGVyZSBUaGFpbGFuZCBpcyBoaWdoZXN0KTsgIzQ3IGFuZCAjMzkgKHdoZXJlIGFsbCBzaXRlcyBhcmUgY29tcGFyYWJsZSk7ICM1MSAod2hlcmUgR2hhbmEsIFRoYWlsYW5kLCBhbmQgQ2hpbmEgYXJlIGFsbCBjb21wYXJhYmxlKS4gSSB3b3VsZCBzYXkgdGhhdCB0aGVzZSBxdWVzdGlvbnMgYXJlIGxlc3MgZ29vZCBleGFtcGxlcyBvZiB0aGlzICJjbHVzdGVyLiIKCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgMwoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciAzICh0aGUgZGFyayByZWQgY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CmhjbHVzdF9kZiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSAzKSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDMiLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBwcmV2YWxlbmNlIHBhdHRlcm4gaGVyZSBpcyBnZW5lcmFsbHkgbG93ICh+MjUlKSBhY3Jvc3MgdGhlIGJvYXJkLCBidXQgc2xpZ2h0bHkgaGlnaGVyIGluIEdoYW5hIGFuZCBWYW51YXR1IChjbG9zZXIgdG8gNDAlKS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgNAoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciA0ICh0aGUgbGlnaHQgYmx1ZSBjbHVzdGVyIGluIHRoZSBvdmVyYWxsIHBsb3QpLgoKQWdhaW4sIEknbGwgcGxvdCB0aGVzZSBxdWVzdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBwcmV2YWxlbmNlIGluIHRoZSBVUyBzYW1wbGUsIGp1c3QgYXMgYSBwb2ludCBvZiByZWZlcmVuY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuM30KaGNsdXN0X2RmICU+JQogIGZpbHRlcihjbHVzdGVyID09IDQpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogNCIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIGdlbmVyYWxseSBjb21wYXJhYmxlIGFuZCBwcmV0dHkgaGlnaCAofjc1JSkgYWNyb3NzIHRoZSBib2FyZCwgZXNwZWNpYWxseSBpbiBDaGluYSBhbmQgVGhhaWxhbmQuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDUKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgNSAodGhlIGRhcmsgb3JhbmdlIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC42fQpoY2x1c3RfZGYgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gNSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiA1IiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgZ2VuZXJhbGx5IGNvbXBhcmFibGUgYW5kIG1vZGVyYXRlICh+MjUlKSBhY3Jvc3MgdGhlIGJvYXJkLCBidXQgaGlnaGVyIGluIEdoYW5hIGFuZCBWYW51YXR1IChjbG9zZXIgdG8gNTAlKS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgNgoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciA2ICh0aGUgZGFyayBncmVlbiBjbHVzdGVyIGluIHRoZSBvdmVyYWxsIHBsb3QpLgoKQWdhaW4sIEknbGwgcGxvdCB0aGVzZSBxdWVzdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBwcmV2YWxlbmNlIGluIHRoZSBVUyBzYW1wbGUsIGp1c3QgYXMgYSBwb2ludCBvZiByZWZlcmVuY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuM30KaGNsdXN0X2RmICU+JQogIGZpbHRlcihjbHVzdGVyID09IDYpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogNiIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIGdlbmVyYWxseSBjb21wYXJhYmxlIGFuZCBtb2RlcmF0ZSAofjI1JSkgaW4gdGhlIFVTIGFuZCBUaGFpbGFuZCwgYnV0IGhpZ2hlciBpbiBHaGFuYSwgQ2hpbmEsIGFuZCBlc3BlY2lhbGx5IFZhbnVhdHUgKD41MCUpLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlciA3CgpOb3cgSSdsbCBwbG90IHRoZSBwcmV2YWxlbmNlIG9mIGVuZG9yc2VtZW50cyBpbiBlYWNoIHNpdGUgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9ucyBpbiBDbHVzdGVyIDcgKHRoZSBkYXJrIGJsdWUgY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CmhjbHVzdF9kZiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSA3KSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDciLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBwcmV2YWxlbmNlIHBhdHRlcm4gaGVyZSBpcyBnZW5lcmFsbHkgbW9kZXJhdGUgKH4yNSUpIGluIHRoZSBVUyBhbmQgVGhhaWxhbmQsIGhpZ2hlciBpbiBHaGFuYSBhbmQgVmFudWF0dSAofjUwJSksIGFuZCBlc3BlY2lhbGx5IGhpZ2ggaW4gQ2hpbmEgKH42MCUpLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlciA4CgpOb3cgSSdsbCBwbG90IHRoZSBwcmV2YWxlbmNlIG9mIGVuZG9yc2VtZW50cyBpbiBlYWNoIHNpdGUgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9ucyBpbiBDbHVzdGVyIDggKHRoZSBsaWdodCBwdXJwbGUgY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjd9CmhjbHVzdF9kZiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSA4KSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDgiLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBwcmV2YWxlbmNlIHBhdHRlcm4gaGVyZSBpcyBnZW5lcmFsbHkgbW9kZXJhdGUgKH4yNSUpIGFjcm9zcyB0aGUgYm9hcmQsIG1heWJlIGEgbGl0dGxlIGhpZ2hlciBpbiBDaGluYSBhbmQgVmFudWF0dSAoY2xvc2VyIHRvIDQwJSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDkKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgOSAodGhlIGxpZ2h0IGdyZWVuIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQpoY2x1c3RfZGYgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gOSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiA5IiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgZ2VuZXJhbGx5IGhpZ2ggKH41MCUpIGFjcm9zcyB0aGUgYm9hcmQsIGFuZCBlc3BjaWFsbHkgaW4gQ2hpbmEgKGNsb3NlciB0byA3MCUpLgoKCiMgSGllcmFyY2hpY2FsIGNsdXN0ZXJpbmcgcHJldGVuZGluZyB3ZSBvbmx5IGhhZCAyIHNpdGVzIChVUyBhbmQgR2hhbmEpCgpIZXJlIEkgd2lsbCB0cnkgdG8gYXBwcm94aW1hdGUgd2hhdCBpdCB3b3VsZCBiZSBsaWtlIHRvIGRvIHRoaXMgYW5hbHlzaXMgd2l0aCBvbmx5IDIgc2l0ZXMsIHRvIGdpdmUgYSBzZW5zZSBvZiB3aGV0aGVyIHRoaXMgd291bGQgbWFrZSBzZW5zZSBmb3IgdGhlIDEuMCBkYXRhLiBJJ2xsIGxpbWl0IHRoZSBkYXRhIHRvIG9ubHkgMiBzaXRlcyAoVVMgYW5kIEdoYW5hKSBhbmQgZG8gZXZlcnl0aGluZyBJIGRpZCBiZWZvcmUuCgpgYGB7cn0KaGNsdXN0X3ByZXYyIDwtIGRfcHJldl93aWRlICU+JSAKICByb3duYW1lc190b19jb2x1bW4oInRhdmVzX2N0cnkiKSAlPiUKICBmaWx0ZXIodGF2ZXNfY3RyeSAlaW4lIGMoIlVTIiwgIkdoYW5hIikpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygidGF2ZXNfY3RyeSIpICU+JQogIHQoKSAlPiUgCiAgZGlzdCgpICU+JSAKICBoY2x1c3QoKQpgYGAKCmBgYHtyLCBmaWcud2lkdGggPSA4LCBmaWcuYXNwID0gMX0KaGNsdXN0X3ByZXYyICU+JSAKICBhcy5kZW5kcm9ncmFtKCkgJT4lIAogIHNldCgibGFiZWxzX2NvbCIsIGsgPSA4LCB2YWx1ZSA9IGMoIiNhNmNlZTMiLCAiIzFmNzhiNCIsICIjYjJkZjhhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjMzNhMDJjIiwgIiNmYjlhOTkiLCAiI2UzMWExYyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiNmZGJmNmYiLCAiI2ZmN2YwMCIsICIjY2FiMmQ2IikpICU+JSAKICBwbG90KGhvcml6ID0gVCwgeGxpbSA9IGMoMS41LCAtMTIpLCBheGVzID0gRikKYGBgCgpIZXJlLCA4IHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIG51bWJlciBvZiBjbHVzdGVycyB0byBsb29rIGF0LiBJIHdpc2ggdGhhdCB0aGUgbGlnaHQgb3JhbmdlIGNsdXN0ZXIgd2VyZW4ndCBhIGNsdXN0ZXIgb2YgMSwgYnV0IGl0IHJlcXVpcmVzIGdvaW5nIGRvd24gdG8ganVzdCA1IGNsdXN0ZXJzIHRvIGdldCB0aGVyZSwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgb3RoZXIgY2x1c3RlcnMgZ2V0IHF1aXRlIGxhcmdlLgoKYGBge3J9CmhjbHVzdF9kZjIgPC0gZGF0YS5mcmFtZShjbHVzdGVyID0gY3V0cmVlKGhjbHVzdF9wcmV2MiwgOCkpICU+JQogIHJvd25hbWVzX3RvX2NvbHVtbigicXVlc3Rpb25fdGV4dCIpICU+JQogIGZ1bGxfam9pbihkX3ByZXYgJT4lIGZpbHRlcih0YXZlc19jdHJ5ICVpbiUgYygiVVMiLCAiR2hhbmEiKSkpICU+JQogIGxlZnRfam9pbihkX3ByZXYgJT4lIAogICAgICAgICAgICAgIGZpbHRlcih0YXZlc19jdHJ5ID09ICJVUyIpICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChxdWVzdGlvbiwgcHJldikgJT4lIAogICAgICAgICAgICAgIHJlbmFtZSgiVVNfcHJldiIgPSAicHJldiIpKSAlPiUKICBhcnJhbmdlKGNsdXN0ZXIsIGRlc2MoVVNfcHJldiksIHRhdmVzX2N0cnkpCmBgYAoKIyMgQ2x1c3RlciAxCgpGb2xsb3dpbmcgdGhlIDUtc2l0ZSBhbmFseXNpcyBhYm92ZSwgaGVyZSBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgMS4gKFRoaXMgaXMgdGhlIHBpbmsgY2x1c3RlciBhYm92ZS4pCgpJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAxfQpoY2x1c3RfZGYyICU+JQogIGZpbHRlcihjbHVzdGVyID09IDEpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogMSIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIG1vZGVyYXRlIGluIHRoZSBVUyAoPjI1JSkgYW5kIGhpZ2hlciBpbiBHaGFuYSAoY2xvc2UgdG8gNTAlKS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgMgoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciAyICh0aGUgbGlnaHQgZ3JlZW4gY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjV9CmhjbHVzdF9kZjIgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gMikgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiAyIiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgbG93IGluIHRoZSBVUyAoPDEwJSkgYW5kIG1vZGVyYXRlIGluIEdoYW5hICh+MjUlKS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgMwoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciAzICh0aGUgZGFyayBncmVlbiBjbHVzdGVyIGluIHRoZSBvdmVyYWxsIHBsb3QpLgoKQWdhaW4sIEknbGwgcGxvdCB0aGVzZSBxdWVzdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBwcmV2YWxlbmNlIGluIHRoZSBVUyBzYW1wbGUsIGp1c3QgYXMgYSBwb2ludCBvZiByZWZlcmVuY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuN30KaGNsdXN0X2RmMiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSAzKSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDMiLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpJdCBsb29rcyBsaWtlIHRoZSBwcmV2YWxlbmNlIHBhdHRlcm4gaGVyZSBpcyByZWxhdGl2ZWx5IGhpZ2ggYWNyb3NzIHRoZSBib2FyZCAoPjUwJSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDQKCk5vdyBJJ2xsIHBsb3QgdGhlIHByZXZhbGVuY2Ugb2YgZW5kb3JzZW1lbnRzIGluIGVhY2ggc2l0ZSBmb3IgZWFjaCBvZiB0aGUgcXVlc3Rpb25zIGluIENsdXN0ZXIgNCAodGhlIGRhcmsgYmx1ZSBjbHVzdGVyIGluIHRoZSBvdmVyYWxsIHBsb3QpLgoKQWdhaW4sIEknbGwgcGxvdCB0aGVzZSBxdWVzdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBwcmV2YWxlbmNlIGluIHRoZSBVUyBzYW1wbGUsIGp1c3QgYXMgYSBwb2ludCBvZiByZWZlcmVuY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDF9CmhjbHVzdF9kZjIgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gNCkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiA0IiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgZ2VuZXJhbGx5IG1vZGVyYXRlIGFjcm9zcyB0aGUgdHdvIHNpdGVzICh+MjUlKSwgc2xpZ2h0bHkgaGlnaGVyIGluIEdoYW5hICh+NDAlKS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgNQoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciA1ICh0aGUgZGFyayByZWQgY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjZ9CmhjbHVzdF9kZjIgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gNSkgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiA1IiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgZ2VuZXJhbGx5IGNvbXBhcmFibGUgYW5kIG1vZGVyYXRlIChjbG9zZSB0byA1MCUpIGFjcm9zcyB0aGUgYm9hcmQgLSBpZiBhbnl0aGluZywgcGVyaGFwcyBhIGxpdHRsZSBoaWdoZXIgaW4gdGhlIFVTIG9uIGEgY291cGxlIG9mIGl0ZW1zLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlciA2CgpOb3cgSSdsbCBwbG90IHRoZSBwcmV2YWxlbmNlIG9mIGVuZG9yc2VtZW50cyBpbiBlYWNoIHNpdGUgZm9yIGVhY2ggb2YgdGhlIHF1ZXN0aW9ucyBpbiBDbHVzdGVyIDYgKHRoZSBsaWdodCBibHVlIGNsdXN0ZXIgaW4gdGhlIG92ZXJhbGwgcGxvdCkuCgpBZ2FpbiwgSSdsbCBwbG90IHRoZXNlIHF1ZXN0aW9ucyBpbiBkZXNjZW5kaW5nIG9yZGVyIG9mIHRoZWlyIHByZXZhbGVuY2UgaW4gdGhlIFVTIHNhbXBsZSwganVzdCBhcyBhIHBvaW50IG9mIHJlZmVyZW5jZS4KCmBgYHtyLCBmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMC40fQpoY2x1c3RfZGYyICU+JQogIGZpbHRlcihjbHVzdGVyID09IDYpICU+JQogIG11dGF0ZShxdWVzdGlvbl90ZXh0ID0gZ3N1YignKC57MSw0MH0pKFxcc3wkKScsICdcXDFcbicsIHF1ZXN0aW9uX3RleHQpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSByZW9yZGVyKHF1ZXN0aW9uX3RleHQsIFVTX3ByZXYpLCB5ID0gcHJldiwKICAgICAgICAgICAgIGZpbGwgPSB0YXZlc19jdHJ5LCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnksIHNjYWxlcyA9ICJmcmVlIikgKwogICMgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsdHkgPSAyKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIsIHBvc2l0aW9uID0gImlkZW50aXR5Iiwgc2l6ZSA9IDEsIGFscGhhID0gMC41KSArCiAgc2NhbGVfZmlsbF9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX3lfY29udGludW91cyhsaW1pdHMgPSBjKDAsIDEpLCBicmVha3MgPSBzZXEoMCwgMSwgMC41KSkgKwogIGxhYnModGl0bGUgPSAiQ2x1c3RlcjogNiIsCiAgICAgICB4ID0gIiIsIHkgPSAicHJvcG9ydGlvbiBzYXlpbmcgWUVTIikgKwogIHRoZW1lX2J3KCkgKwogIGNvb3JkX2ZsaXAoKQpgYGAKCkl0IGxvb2tzIGxpa2UgdGhlIHByZXZhbGVuY2UgcGF0dGVybiBoZXJlIGlzIHZlcnkgbG93IGluIHRoZSBVUyAoPDEwJSkgYW5kIHNsaWdodGx5IGhpZ2hlciBpbiBHaGFuYSAofjIwJSkuCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgNwoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciA3ICh0aGUgZGFyayBvcmFuZ2UgY2x1c3RlciBpbiB0aGUgb3ZlcmFsbCBwbG90KS4KCkFnYWluLCBJJ2xsIHBsb3QgdGhlc2UgcXVlc3Rpb25zIGluIGRlc2NlbmRpbmcgb3JkZXIgb2YgdGhlaXIgcHJldmFsZW5jZSBpbiB0aGUgVVMgc2FtcGxlLCBqdXN0IGFzIGEgcG9pbnQgb2YgcmVmZXJlbmNlLgoKYGBge3IsIGZpZy53aWR0aCA9IDUsIGZpZy5hc3AgPSAwLjR9CmhjbHVzdF9kZjIgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgPT0gNykgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uX3RleHQgPSBnc3ViKCcoLnsxLDQwfSkoXFxzfCQpJywgJ1xcMVxuJywgcXVlc3Rpb25fdGV4dCkpICU+JQogIGdncGxvdChhZXMoeCA9IHJlb3JkZXIocXVlc3Rpb25fdGV4dCwgVVNfcHJldiksIHkgPSBwcmV2LAogICAgICAgICAgICAgZmlsbCA9IHRhdmVzX2N0cnksIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBmYWNldF9ncmlkKH4gdGF2ZXNfY3RyeSwgc2NhbGVzID0gImZyZWUiKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiaWRlbnRpdHkiLCBzaXplID0gMSwgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIsIGd1aWRlID0gIm5vbmUiKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoMCwgMSksIGJyZWFrcyA9IHNlcSgwLCAxLCAwLjUpKSArCiAgbGFicyh0aXRsZSA9ICJDbHVzdGVyOiA3IiwKICAgICAgIHggPSAiIiwgeSA9ICJwcm9wb3J0aW9uIHNheWluZyBZRVMiKSArCiAgdGhlbWVfYncoKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKSXQgbG9va3MgbGlrZSB0aGUgcHJldmFsZW5jZSBwYXR0ZXJuIGhlcmUgaXMgZmFpcmx5IGxvdyBpbiB0aGUgVVMgKDwyNSUpIGFuZCBoaWdoIGluIEdoYW5hICg+NTAlKS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXIgOAoKTm93IEknbGwgcGxvdCB0aGUgcHJldmFsZW5jZSBvZiBlbmRvcnNlbWVudHMgaW4gZWFjaCBzaXRlIGZvciBlYWNoIG9mIHRoZSBxdWVzdGlvbnMgaW4gQ2x1c3RlciA4ICh0aGUgb3RoZXIgaGFsZiBvZiB0aGUgZGFyayBncmVlbiBjbHVzdGVyIGluIHRoZSBvdmVyYWxsIHBsb3QpLgoKQWdhaW4sIEknbGwgcGxvdCB0aGVzZSBxdWVzdGlvbnMgaW4gZGVzY2VuZGluZyBvcmRlciBvZiB0aGVpciBwcmV2YWxlbmNlIGluIHRoZSBVUyBzYW1wbGUsIGp1c3QgYXMgYSBwb2ludCBvZiByZWZlcmVuY2UuCgpgYGB7ciwgZmlnLndpZHRoID0gNSwgZmlnLmFzcCA9IDAuMn0KaGNsdXN0X2RmMiAlPiUKICBmaWx0ZXIoY2x1c3RlciA9PSA4KSAlPiUKICBtdXRhdGUocXVlc3Rpb25fdGV4dCA9IGdzdWIoJyguezEsNDB9KShcXHN8JCknLCAnXFwxXG4nLCBxdWVzdGlvbl90ZXh0KSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcmVvcmRlcihxdWVzdGlvbl90ZXh0LCBVU19wcmV2KSwgeSA9IHByZXYsCiAgICAgICAgICAgICBmaWxsID0gdGF2ZXNfY3RyeSwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGZhY2V0X2dyaWQofiB0YXZlc19jdHJ5LCBzY2FsZXMgPSAiZnJlZSIpICsKICAjIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJpZGVudGl0eSIsIHNpemUgPSAxLCBhbHBoYSA9IDAuNSkgKwogIHNjYWxlX2ZpbGxfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiLCBndWlkZSA9ICJub25lIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIiwgZ3VpZGUgPSAibm9uZSIpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygwLCAxKSwgYnJlYWtzID0gc2VxKDAsIDEsIDAuNSkpICsKICBsYWJzKHRpdGxlID0gIkNsdXN0ZXI6IDgiLAogICAgICAgeCA9ICIiLCB5ID0gInByb3BvcnRpb24gc2F5aW5nIFlFUyIpICsKICB0aGVtZV9idygpICsKICBjb29yZF9mbGlwKCkKYGBgCgpUaGlzIGlzIG9uZSBpdGVtIGFuZCBpdCBoYXBwZW5zIHRvIGJlIG1vZGVyYXRlIGludGhlIFVTIGFuZCBoaWdoIGluIEdoYW5hLiBJIHdvdWxkbid0IG1ha2UgbXVjaCBvZiB0aGlzIGZhY3Rvci4KCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KCmBgYHtyLCBpbmNsdWRlID0gRn0KIyBDb21wYXJpbmcgY2x1c3RlciBhbmFseXNlcwpmdWxsX2pvaW4oaGNsdXN0X2RmICU+JQogICAgICAgICAgICBkaXN0aW5jdChjbHVzdGVyLCBxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCkgJT4lCiAgICAgICAgICAgIHJlbmFtZShjbHVzdGVyXzVzaXRlcyA9IGNsdXN0ZXIpLAogICAgICAgICAgaGNsdXN0X2RmMiAlPiUKICAgICAgICAgICAgZGlzdGluY3QoY2x1c3RlciwgcXVlc3Rpb24pICU+JQogICAgICAgICAgICByZW5hbWUoY2x1c3Rlcl8yc2l0ZXMgPSBjbHVzdGVyKSkgJT4lCiAgc2VsZWN0KHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0LCBjbHVzdGVyXzVzaXRlcywgY2x1c3Rlcl8yc2l0ZXMpICU+JQogIGNvdW50KGNsdXN0ZXJfNXNpdGVzLCBjbHVzdGVyXzJzaXRlcykgJT4lCiAgZ3JvdXBfYnkoY2x1c3Rlcl81c2l0ZXMpICU+JQogIG11dGF0ZShwcm9wID0gbi9zdW0obikpICU+JQogIHRvcF9uKDEsIHByb3ApICU+JSAKICBhcnJhbmdlKGRlc2MocHJvcCkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpoY2x1c3RfcHJldjMgPC0gZF9wcmV2X3dpZGUgJT4lIAogIHJvd25hbWVzX3RvX2NvbHVtbigidGF2ZXNfY3RyeSIpICU+JQogIGZpbHRlcighdGF2ZXNfY3RyeSAlaW4lIGMoIlVTIiwgIkdoYW5hIikpICU+JQogIGNvbHVtbl90b19yb3duYW1lcygidGF2ZXNfY3RyeSIpICU+JQogIHQoKSAlPiUgCiAgZGlzdCgpICU+JSAKICBoY2x1c3QoKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRn0KaGNsdXN0X2RmMyA8LSBkYXRhLmZyYW1lKGNsdXN0ZXIgPSBjdXRyZWUoaGNsdXN0X3ByZXYzLCA4KSkgJT4lCiAgcm93bmFtZXNfdG9fY29sdW1uKCJxdWVzdGlvbl90ZXh0IikgJT4lCiAgZnVsbF9qb2luKGRfcHJldiAlPiUgZmlsdGVyKCF0YXZlc19jdHJ5ICVpbiUgYygiVVMiLCAiR2hhbmEiKSkpICU+JQogIGxlZnRfam9pbihkX3ByZXYgJT4lIAogICAgICAgICAgICAgIGZpbHRlcih0YXZlc19jdHJ5ID09ICJVUyIpICU+JSAKICAgICAgICAgICAgICBkaXN0aW5jdChxdWVzdGlvbiwgcHJldikgJT4lIAogICAgICAgICAgICAgIHJlbmFtZSgiVVNfcHJldiIgPSAicHJldiIpKSAlPiUKICBhcnJhbmdlKGNsdXN0ZXIsIGRlc2MoVVNfcHJldiksIHRhdmVzX2N0cnkpCmBgYAoKYGBge3IsIGluY2x1ZGUgPSBGfQpmdWxsX2pvaW4oaGNsdXN0X2RmMiAlPiUKICAgICAgICAgICAgZGlzdGluY3QoY2x1c3RlciwgcXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQpICU+JQogICAgICAgICAgICByZW5hbWUoY2x1c3Rlcl9VU0dIID0gY2x1c3RlciksCiAgICAgICAgICBoY2x1c3RfZGYzICU+JQogICAgICAgICAgICBkaXN0aW5jdChjbHVzdGVyLCBxdWVzdGlvbikgJT4lCiAgICAgICAgICAgIHJlbmFtZShjbHVzdGVyX1RIQ0hWVCA9IGNsdXN0ZXIpKSAlPiUKICBzZWxlY3QocXVlc3Rpb24sIHF1ZXN0aW9uX3RleHQsIGNsdXN0ZXJfVVNHSCwgY2x1c3Rlcl9USENIVlQpICU+JQogIGNvdW50KGNsdXN0ZXJfVVNHSCwgY2x1c3Rlcl9USENIVlQpICU+JQogIGdyb3VwX2J5KGNsdXN0ZXJfVVNHSCkgJT4lCiAgbXV0YXRlKHByb3AgPSBuL3N1bShuKSkgJT4lCiAgdG9wX24oMSwgcHJvcCkgJT4lIAogIGFycmFuZ2UoZGVzYyhwcm9wKSkKYGBgCgoKIyBUZXN0aW5nIHByZWRpY3Rpb25zCgpUaGVzZSBhcmUgcHJlZGljdGlvbnMgd2UgYXJ0aWN1bGF0ZWQgYXMgYSBncm91cCBvbiAyMDE4LTEyLTEwCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmhjbHVzdF9kZl9ncm91cGVkIDwtIGhjbHVzdF9kZiAlPiUKICBtdXRhdGUobGV2ZWwxID0gY2FzZV93aGVuKGNsdXN0ZXIgJWluJSBjKDYsIDksIDcsIDQpIH4gIjY3OTQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciAlaW4lIGMoOCwgNSwgMSwgMywgMikgfiAiODUxMzIiKSwKICAgICAgICAgbGV2ZWwydW5jb21tb24gPSBjYXNlX3doZW4oY2x1c3RlciAlaW4lIGMoOCwgNSwgMSkgfiAiODUxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciAlaW4lIGMoMywgMikgfiAiMzIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIGxldmVsMmNvbW1vbiA9IGNhc2Vfd2hlbihjbHVzdGVyICVpbiUgYyg2LCA5LCA3KSB+ICI2NzkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2x1c3RlciAlaW4lIGMoNCkgfiAiNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gTkFfY2hhcmFjdGVyXyksCiAgICAgICAgIGxldmVsMyA9IGNhc2Vfd2hlbihjbHVzdGVyICVpbiUgYyg2LCA5KSB+ICI2OSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyICVpbiUgYyg3KSB+ICI3IikpICU+JQogIG11dGF0ZShsZXZlbDEgPSBmYWN0b3IobGV2ZWwxLCBsZXZlbHMgPSBjKCI4NTEzMiIsICI2Nzk0IikpLAogICAgICAgICBsZXZlbDJ1bmNvbW1vbiA9IGZhY3RvcihsZXZlbDJ1bmNvbW1vbiwgbGV2ZWxzID0gYygiMzIiLCAiODUxIikpLAogICAgICAgICBsZXZlbDJjb21tb24gPSBmYWN0b3IobGV2ZWwyY29tbW9uLCBsZXZlbHMgPSBjKCI2NzkiLCAiNCIpKSwKICAgICAgICAgbGV2ZWwzID0gZmFjdG9yKGxldmVsMywgbGV2ZWxzID0gYygiNyIsICI2OSIpKSkKYGBgCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmhjbHVzdF9kZl9ncm91cGVkIDwtIGhjbHVzdF9kZl9ncm91cGVkICU+JQogIGZ1bGxfam9pbihkX2Jhc2UgJT4lCiAgICAgICAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJ0YXZlc19zdWJqIikgJT4lCiAgICAgICAgICAgICAgZ2F0aGVyKHF1ZXN0aW9uLCByZXNwb25zZSwgLXRhdmVzX3N1YmopICU+JQogICAgICAgICAgICAgIGZ1bGxfam9pbihkMCAlPiUgZGlzdGluY3QodGF2ZXNfY3RyeSwgdGF2ZXNfc3ViaikpICU+JQogICAgICAgICAgICAgIGZpbHRlcighaXMubmEocmVzcG9uc2UpLCAhZ3JlcGwoIm51bSIsIHF1ZXN0aW9uKSkgJT4lCiAgICAgICAgICAgICAgY291bnQodGF2ZXNfY3RyeSwgcXVlc3Rpb24pKQpgYGAKCgojIyBDbHVzdGVycyA2Nzk0IGFyZSBtb3JlIGNvbW1vbiB0aGFuIHRoZSBvdGhlcnMKCmBgYHtyfQpnbG1lcihwcmV2IH4gbGV2ZWwxICsgKDF8cXVlc3Rpb24pICsgKDF8dGF2ZXNfY3RyeSksCiAgICAgIGhjbHVzdF9kZl9ncm91cGVkLAogICAgICBmYW1pbHkgPSAiYmlub21pYWwiLCB3ZWlnaHRzID0gbikgJT4lIAogIHN1bW1hcnkoKQpgYGAKCmBgYHtyfQpoY2x1c3RfZGZfZ3JvdXBlZCAlPiUKICBncm91cF9ieShsZXZlbDEsIHRhdmVzX2N0cnkpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInByZXYiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsZXZlbDEsIHkgPSBtZWFuLCBjb2xvciA9IHRhdmVzX2N0cnkpKSArIAogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHlsaW0oMCwgMSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUHJlZGljdGlvbjogQ2x1c3RlcnMgNjc5NCBhcmUgbW9yZSBjb21tb24gdGhhbiB0aGUgb3RoZXJzIiwKICAgICAgIHggPSAiQ2x1c3RlciBncm91cCAobGV2ZWwgMSBkaXZpZGUpIiwgeSA9ICJQcmV2YWxlbmNlICgwLTEpIiwKICAgICAgIGNvbG9yID0gIlNpdGUiKQpgYGAKClllcywgdGhpcyBwcmVkaWN0aW9uIGlzIHVwaGVsZCAoYm90aCBpbiB0aGUgYWdncmVnYXRlIGFuZCBsb29raW5nIGF0IGVhY2ggc2l0ZSBpbmRpdmlkdWFsbHkpLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlcnMgNjc5IGFwcHJhaXNlZCBhcyByZWxpZ2lvdXMgbW9yZSBmcmVxdWVudGx5IHRoYW4gY2x1c3RlciA0CgpgYGB7cn0KZF9hcHByYWlzYWxfbnVtMiA8LSBkX2FwcHJhaXNhbF9udW0gJT4lCiAgICAgICAgcm93bmFtZXNfdG9fY29sdW1uKCJ0YXZlc19zdWJqIikgJT4lCiAgICAgICAgZnVsbF9qb2luKGQwICU+JSBkaXN0aW5jdCh0YXZlc19zdWJqLCB0YXZlc19jdHJ5KSkgJT4lCiAgICAgICAgZ2F0aGVyKHF1ZXN0aW9uLCBhcHByYWlzYWwsIC1jKHRhdmVzX3N1YmosIHRhdmVzX2N0cnkpKSAlPiUKICAgICAgICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJiX251bSIsICIiLCBxdWVzdGlvbikpICU+JQogICAgICAgIGZ1bGxfam9pbihoY2x1c3RfZGZfZ3JvdXBlZCAlPiUgCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHF1ZXN0aW9uLCBjbHVzdGVyLCBzdGFydHNfd2l0aCgibGV2ZWwiKSkgJT4lCiAgICAgICAgICAgICAgICAgICAgZGlzdGluY3QoKSkgJT4lCiAgZmlsdGVyKCFpcy5uYShhcHByYWlzYWwpKSAlPiUKICBkaXN0aW5jdCgpCmBgYAoKYGBge3J9CmxtZXIoYXBwcmFpc2FsIH4gbGV2ZWwyY29tbW9uICsgKDF8cXVlc3Rpb24pICsgKDF8dGF2ZXNfY3RyeS90YXZlc19zdWJqKSwKICAgICBkX2FwcHJhaXNhbF9udW0yICU+JSBmaWx0ZXIoIWlzLm5hKGFwcHJhaXNhbCkpKSAlPiUgCiAgc3VtbWFyeSgpCmBgYAoKYGBge3J9CmRfYXBwcmFpc2FsX251bTIgJT4lCiAgZmlsdGVyKCFpcy5uYShsZXZlbDJjb21tb24pKSAlPiUKICBncm91cF9ieShsZXZlbDJjb21tb24sIHRhdmVzX2N0cnkpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoImFwcHJhaXNhbCIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodGF2ZXNfY3RyeSA9IGZhY3Rvcih0YXZlc19jdHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IGxldmVsMmNvbW1vbiwgeSA9IG1lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICB5bGltKC0xLCAxKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0aW9uOiBDbHVzdGVycyA2NzkgYXBwcmFpc2VkIGFzIHJlbGlnaW91cyBtb3JlIGZyZXF1ZW50bHlcbnRoYW4gY2x1c3RlciA0IiwKICAgICAgIHggPSAiQ2x1c3RlciBncm91cCAobGV2ZWwgMiBkaXZpZGUsIGFtb25nICdjb21tb24nIGNsdXN0ZXJzIG9ubHkpIiwgCiAgICAgICB5ID0gIkFwcHJhaXNhbCAoLTEgdG8gKzEpIiwKICAgICAgIGNvbG9yID0gIlNpdGUiKQpgYGAKCmBgYHtyfQpkX2FwcHJhaXNhbF9udW0yICU+JQogIGZpbHRlcighaXMubmEobGV2ZWwyY29tbW9uKSkgJT4lCiAgZ3JvdXBfYnkobGV2ZWwyY29tbW9uLCB0YXZlc19jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJhcHByYWlzYWwiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsZXZlbDJjb21tb24sIAogICAgICAgICAgICAgeSA9IG1lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsgCiAgZmFjZXRfZ3JpZCh+IHRhdmVzX2N0cnkpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICB5bGltKC0xLCAxKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0aW9uOiBDbHVzdGVycyA2NzkgYXBwcmFpc2VkIGFzIHJlbGlnaW91cyBtb3JlIGZyZXF1ZW50bHlcbnRoYW4gY2x1c3RlciA0IiwKICAgICAgIHggPSAiQ2x1c3RlciBncm91cCAobGV2ZWwgMiBkaXZpZGUsIGFtb25nICdjb21tb24nIGNsdXN0ZXJzIG9ubHkpIiwgCiAgICAgICB5ID0gIkFwcHJhaXNhbCAoLTEgdG8gKzEpIiwKICAgICAgIGNvbG9yID0gIlNpdGUiKQpgYGAKClRoZSByZXN1bHRzIGZvciB0aGlzIHByZWRpY3Rpb24gYXJlIG1peGVkLiBJdCBpcyAqbm90KiB1cGhlbGQgaW4gdGhlIGFnZ3JlZ2F0ZSwgYnV0IHNlZW1zIHRvIGJlIHRydWUgaW4gdGhlIFVTLCBhbmQgcG9zc2libHkgaW4gR2hhbmEgYW5kIFZhbnVhdHUgKGkuZS4sIENocmlzdGlhbiBjb3VudHJpZXM/KS4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXJzIDY3OSB3aWxsIGJlIG1hcmtlZCBhcyBwb3NpdGl2ZS9uZWdhdGl2ZSByYXRoZXIgdGhhbiBjbHVzdGVyIDQgKD8pCgpgYGB7cn0KZF92YWxlbmNlX251bTIgPC0gZF92YWxlbmNlX251bSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInRhdmVzX3N1YmoiKSAlPiUKICBmdWxsX2pvaW4oZDAgJT4lIGRpc3RpbmN0KHRhdmVzX3N1YmosIHRhdmVzX2N0cnkpKSAlPiUKICBnYXRoZXIocXVlc3Rpb24sIHZhbGVuY2UsIC1jKHRhdmVzX3N1YmosIHRhdmVzX2N0cnkpKSAlPiUKICBtdXRhdGUocXVlc3Rpb24gPSBnc3ViKCJkX251bSIsICIiLCBxdWVzdGlvbikpICU+JQogIGZ1bGxfam9pbihoY2x1c3RfZGZfZ3JvdXBlZCAlPiUKICAgICAgICAgICAgICBzZWxlY3QocXVlc3Rpb24sIGNsdXN0ZXIsIHN0YXJ0c193aXRoKCJsZXZlbCIpKSAlPiUKICAgICAgICAgICAgICBkaXN0aW5jdCgpKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHZhbGVuY2UpKSAlPiUKICBkaXN0aW5jdCgpCmBgYAoKYGBge3J9CmxtZXIoYWJzKHZhbGVuY2UpIH4gbGV2ZWwyY29tbW9uICsgKDF8cXVlc3Rpb24pICsgKDF8dGF2ZXNfY3RyeS90YXZlc19zdWJqKSwKICAgICBkX3ZhbGVuY2VfbnVtMiAlPiUgZmlsdGVyKCFpcy5uYSh2YWxlbmNlKSkpICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KZF92YWxlbmNlX251bTIgJT4lCiAgZmlsdGVyKCFpcy5uYShsZXZlbDJjb21tb24pKSAlPiUKICBncm91cF9ieShsZXZlbDJjb21tb24sIHRhdmVzX2N0cnkpICU+JQogIG11dGF0ZSh2YWxlbmNlID0gYWJzKHZhbGVuY2UpKSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJ2YWxlbmNlIikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGV2ZWwyY29tbW9uLCB5ID0gbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHlsaW0oMCwgMSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUHJlZGljdGlvbjogQ2x1c3RlcnMgNjc5IHdpbGwgYmUgbWFya2VkIGFzXG5wb3NpdGl2ZS9uZWdhdGl2ZSByYXRoZXIgdGhhbiBjbHVzdGVyIDQiLAogICAgICAgeCA9ICJDbHVzdGVyIGdyb3VwIChsZXZlbCAyIGRpdmlkZSwgYW1vbmcgJ2NvbW1vbicgY2x1c3RlcnMgb25seSkiLCAKICAgICAgIHkgPSAiQWJzb2x1dGUgdmFsZW5jZSAoMCB0byAxKSIsCiAgICAgICBjb2xvciA9ICJTaXRlIikKYGBgCgpZZXMsIHRoaXMgcHJlZGljdGlvbiBpcyB1cGhlbGQgKGJvdGggaW4gdGhlIGFnZ3JlZ2F0ZSBhbmQgbG9va2luZyBhdCBlYWNoIHNpdGUgaW5kaXZpZHVhbGx5LCB3aXRoIHRoZSBwb3NzaWJsZSBleGNlcHRpb24gb2YgVmFudWF0dSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVyIDY5IHdpbGwgYmUgbW9yZSBwb3NpdGl2ZSB0aGFuIGNsdXN0ZXIgNwoKYGBge3J9CmxtZXIodmFsZW5jZSB+IGxldmVsMyArICgxfHF1ZXN0aW9uKSArICgxfHRhdmVzX2N0cnkvdGF2ZXNfc3ViaiksCiAgICAgZF92YWxlbmNlX251bTIgJT4lIGZpbHRlcighaXMubmEodmFsZW5jZSkpKSAlPiUgCiAgc3VtbWFyeSgpCmBgYAoKYGBge3J9CmRfdmFsZW5jZV9udW0yICU+JQogIGZpbHRlcighaXMubmEobGV2ZWwzKSkgJT4lCiAgZ3JvdXBfYnkobGV2ZWwzLCB0YXZlc19jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJ2YWxlbmNlIikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGV2ZWwzLCB5ID0gbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHlsaW0oLTEsIDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIlByZWRpY3Rpb246IENsdXN0ZXJzIDY5IGFwcHJhaXNlZCBhcyBtb3JlXG5wb3NpdGl2ZSB0aGFuIDciLAogICAgICAgeCA9ICJDbHVzdGVyIGdyb3VwIChsZXZlbCAzIGRpdmlkZSwgLi4uKSIsIAogICAgICAgeSA9ICJWYWxlbmNlICgtMSB0byAxKSIsCiAgICAgICBjb2xvciA9ICJTaXRlIikKYGBgCgpZZXMsIHRoaXMgcHJlZGljdGlvbiBpcyBjbGVhcmx5IHVwaGVsZCAoYm90aCBpbiB0aGUgYWdncmVnYXRlIGFuZCBsb29raW5nIGF0IGVhY2ggc2l0ZSBpbmRpdmlkdWFsbHkpLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlcnMgNjc5IGFwcHJhaXNlZCBhcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gNAoKYGBge3J9CmRfc2lnbmlmaWNhbmNlX251bTIgPC0gZF9zaWduaWZpY2FuY2VfbnVtICU+JQogICAgICAgIHJvd25hbWVzX3RvX2NvbHVtbigidGF2ZXNfc3ViaiIpICU+JQogICAgICAgIGZ1bGxfam9pbihkMCAlPiUgZGlzdGluY3QodGF2ZXNfc3ViaiwgdGF2ZXNfY3RyeSkpICU+JQogICAgICAgIGdhdGhlcihxdWVzdGlvbiwgc2lnbmlmaWNhbmNlLCAtYyh0YXZlc19zdWJqLCB0YXZlc19jdHJ5KSkgJT4lCiAgICAgICAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiZV9udW0iLCAiIiwgcXVlc3Rpb24pKSAlPiUKICAgICAgICBmdWxsX2pvaW4oaGNsdXN0X2RmX2dyb3VwZWQgJT4lIAogICAgICAgICAgICAgICAgICAgIHNlbGVjdChxdWVzdGlvbiwgY2x1c3Rlciwgc3RhcnRzX3dpdGgoImxldmVsIikpICU+JQogICAgICAgICAgICAgICAgICAgIGRpc3RpbmN0KCkpICU+JQogIGZpbHRlcighaXMubmEoc2lnbmlmaWNhbmNlKSkgJT4lCiAgZGlzdGluY3QoKQpgYGAKCmBgYHtyfQpsbWVyKHNpZ25pZmljYW5jZSB+IGxldmVsMmNvbW1vbiArICgxfHF1ZXN0aW9uKSArICgxfHRhdmVzX2N0cnkvdGF2ZXNfc3ViaiksCiAgICAgZF9zaWduaWZpY2FuY2VfbnVtMiAlPiUgZmlsdGVyKCFpcy5uYShzaWduaWZpY2FuY2UpKSkgJT4lIAogIHN1bW1hcnkoKQpgYGAKCmBgYHtyfQpkX3NpZ25pZmljYW5jZV9udW0yICU+JQogIGZpbHRlcighaXMubmEobGV2ZWwyY29tbW9uKSkgJT4lCiAgZ3JvdXBfYnkobGV2ZWwyY29tbW9uLCB0YXZlc19jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJzaWduaWZpY2FuY2UiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsZXZlbDJjb21tb24sIHkgPSBtZWFuLCBjb2xvciA9IHRhdmVzX2N0cnkpKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgeWxpbSgwLCAxKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0aW9uOiBDbHVzdGVycyA2NzkgYXBwcmFpc2VkIGFzIG1vcmVcbnNpZ25pZmljYW50IHRoYW4gNCIsCiAgICAgICB4ID0gIkNsdXN0ZXIgZ3JvdXAgKGxldmVsIDIgZGl2aWRlLCBhbW9uZyAnY29tbW9uJyBjbHVzdGVycyBvbmx5KSIsIAogICAgICAgeSA9ICJTaWduaWZpY2FuY2UgKDAgdG8gMSkiLAogICAgICAgY29sb3IgPSAiU2l0ZSIpCmBgYAoKWWVzLCB0aGlzIHByZWRpY3Rpb24gaXMgdXBoZWxkIChib3RoIGluIHRoZSBhZ2dyZWdhdGUgYW5kIGxvb2tpbmcgYXQgZWFjaCBzaXRlIGluZGl2aWR1YWxseSkuCgoKPFAgc3R5bGU9InBhZ2UtYnJlYWstYmVmb3JlOiBhbHdheXMiPgojIyBDbHVzdGVycyA4NTEgbW9yZSBjb21tb24gdGhhbiBjbHVzdGVycyAzMgoKYGBge3J9CmdsbWVyKHByZXYgfiBsZXZlbDJ1bmNvbW1vbiArICgxfHF1ZXN0aW9uKSArICgxfHRhdmVzX2N0cnkpLAogICAgICBoY2x1c3RfZGZfZ3JvdXBlZCwKICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgd2VpZ2h0cyA9IG4pICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KaGNsdXN0X2RmX2dyb3VwZWQgJT4lCiAgZmlsdGVyKCFpcy5uYShsZXZlbDJ1bmNvbW1vbikpICU+JQogIGdyb3VwX2J5KGxldmVsMnVuY29tbW9uLCB0YXZlc19jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJwcmV2IikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSkgJT4lCiAgZ2dwbG90KGFlcyh4ID0gbGV2ZWwydW5jb21tb24sIHkgPSBtZWFuLCBjb2xvciA9IHRhdmVzX2N0cnkpKSArIAogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IGNpX2xvd2VyLCB5bWF4ID0gY2lfdXBwZXIpLAogICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSkgKwogIHlsaW0oMCwgMSkgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIkRhcmsyIikgKwogIHRoZW1lX2J3KCkgKwogIGxhYnModGl0bGUgPSAiUHJlZGljdGlvbjogQ2x1c3RlcnMgODUxIG1vcmUgY29tbW9uIHRoYW4gY2x1c3RlcnMgMzIiLAogICAgICAgeCA9ICJDbHVzdGVyIGdyb3VwIChsZXZlbCAyIGRpdmlkZSwgYW1vbmcgJ3VuY29tbW9uJyBjbHVzdGVycyBvbmx5KSIsIAogICAgICAgeSA9ICJQcmV2YWxlbmNlICgwLTEpIiwgY29sb3IgPSAiU2l0ZSIpCmBgYAoKWWVzLCB0aGlzIHByZWRpY3Rpb24gaXMgdXBoZWxkIChib3RoIGluIHRoZSBhZ2dyZWdhdGUgYW5kIGxvb2tpbmcgYXQgZWFjaCBzaXRlIGluZGl2aWR1YWxseSwgd2l0aCB0aGUgcHJvYmFibGUgZXhjZXB0aW9uIG9mIFZhbnVhdHUpLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlcnMgOCB0byA1IHRvIDE6IGluY3JlYXNlcyBpbiBkaXZlcmdlbmNlIGJldHdlZW4gY291bnRyaWVzCgpgYGB7cn0KaGNsdXN0X2RmX2dyb3VwZWQgJT4lCiAgZmlsdGVyKGNsdXN0ZXIgJWluJSBjKCIxIiwgIjUiLCAiOCIpKSAlPiUgCiAgZ3JvdXBfYnkoY2x1c3RlciwgdGF2ZXNfY3RyeSkgJT4lCiAgc3VtbWFyaXNlKG1lYW5fcHJldiA9IG1lYW4ocHJldiwgbmEucm0gPSBUKSkgJT4lCiAgZ3JvdXBfYnkoY2x1c3RlcikgJT4lCiAgc3VtbWFyaXNlKHNkID0gc2QobWVhbl9wcmV2KSkKCmJhcnRsZXR0LnRlc3QobWVhbl9wcmV2IH4gY2x1c3RlciwgCiAgICAgICAgICAgICAgaGNsdXN0X2RmX2dyb3VwZWQgJT4lCiAgICAgICAgICAgICAgICBmaWx0ZXIoY2x1c3RlciAlaW4lIGMoIjEiLCAiNSIsICI4IikpICU+JQogICAgICAgICAgICAgICAgZ3JvdXBfYnkoY2x1c3RlciwgdGF2ZXNfY3RyeSkgJT4lCiAgICAgICAgICAgICAgICBzdW1tYXJpc2UobWVhbl9wcmV2ID0gbWVhbihwcmV2LCBuYS5ybSA9IFQpKSkKCmJhcnRsZXR0LnRlc3QobWVhbl9wcmV2IH4gY2x1c3RlciwgCiAgICAgICAgICAgICAgaGNsdXN0X2RmX2dyb3VwZWQgJT4lCiAgICAgICAgICAgICAgICBmaWx0ZXIoY2x1c3RlciAlaW4lIGMoIjEiLCAiNSIpKSAlPiUKICAgICAgICAgICAgICAgIGdyb3VwX2J5KGNsdXN0ZXIsIHRhdmVzX2N0cnkpICU+JQogICAgICAgICAgICAgICAgc3VtbWFyaXNlKG1lYW5fcHJldiA9IG1lYW4ocHJldiwgbmEucm0gPSBUKSkpCgpiYXJ0bGV0dC50ZXN0KG1lYW5fcHJldiB+IGNsdXN0ZXIsIAogICAgICAgICAgICAgIGhjbHVzdF9kZl9ncm91cGVkICU+JQogICAgICAgICAgICAgICAgZmlsdGVyKGNsdXN0ZXIgJWluJSBjKCI1IiwgIjgiKSkgJT4lCiAgICAgICAgICAgICAgICBncm91cF9ieShjbHVzdGVyLCB0YXZlc19jdHJ5KSAlPiUKICAgICAgICAgICAgICAgIHN1bW1hcmlzZShtZWFuX3ByZXYgPSBtZWFuKHByZXYsIG5hLnJtID0gVCkpKQpgYGAKCmBgYHtyfQpoY2x1c3RfZGZfZ3JvdXBlZCAlPiUKICBmaWx0ZXIoY2x1c3RlciAlaW4lIGMoIjEiLCAiNSIsICI4IikpICU+JQogIGdyb3VwX2J5KGNsdXN0ZXIsIHRhdmVzX2N0cnkpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInByZXYiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgbXV0YXRlKHRhdmVzX2N0cnkgPSBmYWN0b3IodGF2ZXNfY3RyeSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiVVMiLCAiR2hhbmEiLCAiVGhhaWxhbmQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBmYWN0b3IoY2x1c3RlciwgbGV2ZWxzID0gYygiOCIsICI1IiwgIjEiKSksIAogICAgICAgICAgICAgeSA9IG1lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSkpICsgCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgeWxpbSgwLCAxKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0aW9uOiBDbHVzdGVycyA4IHRvIDUgdG8gMTogaW5jcmVhc2VzIGluIGRpdmVyZ2VuY2VcbmJldHdlZW4gY291bnRyaWVzIiwKICAgICAgIHggPSAiQ2x1c3RlciBncm91cCAobGV2ZWwgMiBkaXZpZGUsIGFtb25nICd1bmNvbW1vbicgY2x1c3RlcnMgb25seSkiLCAKICAgICAgIHkgPSAiUHJldmFsZW5jZSAoMC0xKSIsIGNvbG9yID0gIlNpdGUiKQpgYGAKClRoaXMgcHJlZGljdGlvbiBsb29rcyBsaWtlIGl0J3MgdXBoZWxkIGFjY29yZGluZyB0byB0aGUgcGxvdCAoZG90cyBmb3IgZWFjaCBzaXRlIGFyZSBjbG9zZXN0IHRvZ2V0aGVyIGZvciBjbHVzdGVyIDggYW5kIG1vc3Qgc2NhdHRlcmVkIGZvciBjbHVzdGVyIDEpLiBJdCBkb2Vzbid0IGNvbWUgb3V0IGFzIHNpZ25pZmljYW50IGluIGEgZm9ybWFsIHRlc3Qgb2YgdGhlIHZhcmlhYmlsaXR5IGFjcm9zcyB0aGUgZml2ZSBzaXRlcyBmb3IgZWFjaCBjbHVzdGVyLCBidXQgSSdtIG5vdCBzdXJlIHdoZXRoZXIgSSdkIGV4cGVjdCB0aGF0IHRvIGNvbWUgb3V0IG9yIG5vdCwgZ2l2ZW4gdGhlIHNhbXBsZSBzaXplIChuID0gNSBzaXRlcykuIChHZW51aW5lbHkgbm90IHN1cmUhKQoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyMgQ2x1c3RlcnMgOCB0byA1IHRvIDE6IGRlY3JlYXNlcyBpbiBmcmVxdWVuY3kKCmBgYHtyfQpnbG1lcihwcmV2IH4gY2x1c3RlciArICgxfHF1ZXN0aW9uKSArICgxfHRhdmVzX2N0cnkpLAogICAgICBoY2x1c3RfZGZfZ3JvdXBlZCAlPiUKICAgICAgICBmaWx0ZXIoY2x1c3RlciAlaW4lIGMoIjEiLCAiNSIsICI4IikpICU+JQogICAgICAgIG11dGF0ZShjbHVzdGVyID0gZmFjdG9yKGNsdXN0ZXIsIGxldmVscyA9IGMoIjgiLCAiNSIsICIxIikpKSwKICAgICAgY29udHJhc3RzID0gbGlzdChjbHVzdGVyID0gY29udHIucG9seSgzKSksCiAgICAgIGZhbWlseSA9ICJiaW5vbWlhbCIsIHdlaWdodHMgPSBuKSAlPiUgCiAgc3VtbWFyeSgpCmBgYAoKYGBge3J9CmhjbHVzdF9kZl9ncm91cGVkICU+JQogIGZpbHRlcihjbHVzdGVyICVpbiUgYygiMSIsICI1IiwgIjgiKSkgJT4lCiAgZ3JvdXBfYnkoY2x1c3RlciwgdGF2ZXNfY3RyeSkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgicHJldiIpICU+JQogIHVuZ3JvdXAoKSAlPiUKICBtdXRhdGUodGF2ZXNfY3RyeSA9IGZhY3Rvcih0YXZlc19jdHJ5LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJVUyIsICJHaGFuYSIsICJUaGFpbGFuZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoaW5hIiwgIlZhbnVhdHUiKSkpICU+JQogIGdncGxvdChhZXMoeCA9IGZhY3RvcihjbHVzdGVyLCBsZXZlbHMgPSBjKCI4IiwgIjUiLCAiMSIpKSwgCiAgICAgICAgICAgICB5ID0gbWVhbiwgY29sb3IgPSB0YXZlc19jdHJ5KSkgKyAKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBjaV9sb3dlciwgeW1heCA9IGNpX3VwcGVyKSwKICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsKICB5bGltKDAsIDEpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJEYXJrMiIpICsKICB0aGVtZV9idygpICsKICBsYWJzKHRpdGxlID0gIlByZWRpY3Rpb246IENsdXN0ZXJzIDggdG8gNSB0byAxOiBkZWNyZWFzZXMgaW4gZnJlcXVlbmN5IiwKICAgICAgIHggPSAiQ2x1c3RlciBncm91cCAobGV2ZWwgMiBkaXZpZGUsIGFtb25nICd1bmNvbW1vbicgY2x1c3RlcnMgb25seSkiLCAKICAgICAgIHkgPSAiUHJldmFsZW5jZSAoMC0xKSIsIGNvbG9yID0gIlNpdGUiKQpgYGAKCk5vLCB0aGlzIHByZWRpY3Rpb24gaXMgKm5vdCogdXBoZWxkIChlaXRoZXIgaW4gdGhlIGFnZ3JlZ2F0ZSBvciBsb29raW5nIGF0IGVhY2ggc2l0ZSBpbmRpdmlkdWFsbHksIHdpdGggdGhlIHBvc3NpYmxlIGV4Y2VwdGlvbiBvZiBUaGFpbGFuZCkuIElmIGFueXRoaW5nLCBjbHVzdGVyIDEgZ2VuZXJhbGx5IHNlZW1zIHRvIGJlIHRoZSBtb3N0IGNvbW1vbiBvZiB0aGVzZSB0aHJlZSBjbHVzdGVycy4KCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CiMjIENsdXN0ZXJzIDMyOiBHSCBhbmQgVlQgc3RhbmQgb3V0IGZvciB0aGVpciBlbmRvcnNlbWVudAoKYGBge3J9CmdsbWVyKHByZXYgfiBsZXZlbDJ1bmNvbW1vbiAqIHRhdmVzX2N0cnkgKyAoMXxxdWVzdGlvbiksCiAgICAgIGhjbHVzdF9kZl9ncm91cGVkICU+JQogICAgICAgIGZpbHRlcighaXMubmEobGV2ZWwydW5jb21tb24pKSAlPiUKICAgICAgICBtdXRhdGUodGF2ZXNfY3RyeSA9IGZhY3Rvcih0YXZlc19jdHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKSwKICAgICAgY29udHJhc3RzID0gbGlzdCh0YXZlc19jdHJ5ID0gY2JpbmQoIlVTX290aGVyIiA9IGMoNCwgLTEsIC0xLCAtMSwgLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR0hWVF9USENIIiA9IGMoMCwgMSwgLTEsIC0xLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdIX1ZUIiA9IGMoMCwgMSwgMCwgMCwgLTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVEhfQ0giID0gYygwLCAwLCAtMSwgMSwgMCkpKSwKICAgICAgZmFtaWx5ID0gImJpbm9taWFsIiwgd2VpZ2h0cyA9IG4pICU+JSAKICBzdW1tYXJ5KCkKYGBgCgpgYGB7cn0KaGNsdXN0X2RmX2dyb3VwZWQgJT4lCiAgZmlsdGVyKCFpcy5uYShsZXZlbDJ1bmNvbW1vbikpICU+JQogIGdyb3VwX2J5KGxldmVsMnVuY29tbW9uLCB0YXZlc19jdHJ5KSAlPiUKICBtdWx0aV9ib290X3N0YW5kYXJkKCJwcmV2IikgJT4lCiAgdW5ncm91cCgpICU+JQogIG11dGF0ZSh0YXZlc19jdHJ5ID0gZmFjdG9yKHRhdmVzX2N0cnksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2hpbmEiLCAiVmFudWF0dSIpKSwKICAgICAgICAgR0hWVF9vdGggPSBjYXNlX3doZW4odGF2ZXNfY3RyeSAlaW4lIGMoIkdoYW5hIiwgIlZhbnVhdHUiKSB+ICJHSCAmIFZUIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+ICJvdGhlciIpKSAlPiUKICBnZ3Bsb3QoYWVzKHggPSBsZXZlbDJ1bmNvbW1vbiwgeSA9IG1lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSwgc2hhcGUgPSBHSFZUX290aCkpICsgCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gY2lfbG93ZXIsIHltYXggPSBjaV91cHBlciksCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArCiAgeWxpbSgwLCAxKSArCiAgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKSArCiAgdGhlbWVfYncoKSArCiAgbGFicyh0aXRsZSA9ICJQcmVkaWN0aW9uOiBDbHVzdGVycyAzMjogR0ggYW5kIFZUIHN0YW5kIG91dCBmb3JcbnRoZWlyIGVuZG9yc2VtZW50IiwKICAgICAgIHggPSAiQ2x1c3RlciBncm91cCAobGV2ZWwgMiBkaXZpZGUsIGFtb25nICd1bmNvbW1vbicgY2x1c3RlcnMgb25seSkiLCAKICAgICAgIHkgPSAiUHJldmFsZW5jZSAoMC0xKSIsIGNvbG9yID0gIlNpdGUiLCBzaGFwZSA9ICJHaGFuYS9WYW51YXR1PyIpCmBgYAoKWWVzLCB0aGlzIHByZWRpY3Rpb24gaXMgdXBoZWxkLCBidXQgcmF0aGVyIHdlYWtseTogR2hhbmEgYW5kIFZhbnVhdHUgc3RhbmQgb3V0IGluIGJvdGggY2x1c3RlcnMgMzIgYW5kIGNsdXN0ZXJzIDg1MSwgYnV0IHRoZXkgc3RhbmQgb3V0IGEgbGl0dGxlIG1vcmUgKGdhcCBiZXR3ZWVuIHRoZW0gYW5kIG90aGVyIGNvdW50cmllcyBpcyBhIGxpdHRsZSBiaWdnZXIpIGluIGNsdXN0ZXJzIDMyLgoKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KIyBPdmVyYWxsIHN1bW1hcmllcyBvZiBwcmV2YWxlbmNlLCBhcHByYWlzYWwsIHZhbGVuY2UsICYgc2lnbmlmaWNhbmNlCgpgYGB7ciwgaW5jbHVkZSA9IEZ9CmRmX3ByZXZhbGVuY2UgPC0gZF9iYXNlX251bSAlPiUKICByb3duYW1lc190b19jb2x1bW4oInRhdmVzX3N1YmoiKSAlPiUKICBmdWxsX2pvaW4oZDAgJT4lIHNlbGVjdCh0YXZlc19zdWJqLCB0YXZlc19jdHJ5KSkgJT4lCiAgZ2F0aGVyKHF1ZXN0aW9uLCBlbmRvcnNlbWVudCwgLWModGF2ZXNfc3ViaiwgdGF2ZXNfY3RyeSkpICU+JQogIG11dGF0ZShxdWVzdGlvbiA9IGdzdWIoIl9udW0iLCAiIiwgcXVlc3Rpb24pKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGVuZG9yc2VtZW50KSkgJT4lCiAgZ3JvdXBfYnkodGF2ZXNfY3RyeSwgcXVlc3Rpb24pICU+JQogIG11dGF0ZShwcmV2X24gPSBuKCkpICU+JQogIGdyb3VwX2J5KHByZXZfbiwgYWRkID0gVCkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgiZW5kb3JzZW1lbnQiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgcmVuYW1lKHByZXZfY2lfbG93ZXIgPSBjaV9sb3dlciwKICAgICAgICAgcHJldl9jaV91cHBlciA9IGNpX3VwcGVyLAogICAgICAgICBwcmV2X21lYW4gPSBtZWFuKQoKZGZfYXBwcmFpc2FsIDwtIGRfYXBwcmFpc2FsX251bTIgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiLl9udW0iLCAiIiwgcXVlc3Rpb24pKSAlPiUKICBmaWx0ZXIoIWlzLm5hKGFwcHJhaXNhbCkpICU+JQogIGdyb3VwX2J5KHRhdmVzX2N0cnksIGxldmVsMSwgbGV2ZWwydW5jb21tb24sIGxldmVsMmNvbW1vbiwgbGV2ZWwzLCAKICAgICAgICAgICBjbHVzdGVyLCBxdWVzdGlvbikgJT4lCiAgbXV0YXRlKGFwcF9uID0gbigpKSAlPiUKICBncm91cF9ieShhcHBfbiwgYWRkID0gVCkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgiYXBwcmFpc2FsIikgJT4lCiAgdW5ncm91cCgpICU+JQogIHJlbmFtZShhcHBfY2lfbG93ZXIgPSBjaV9sb3dlciwKICAgICAgICAgYXBwX2NpX3VwcGVyID0gY2lfdXBwZXIsCiAgICAgICAgIGFwcF9tZWFuID0gbWVhbikKCmRmX3ZhbGVuY2UgPC0gZF92YWxlbmNlX251bTIgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiLl9udW0iLCAiIiwgcXVlc3Rpb24pKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHZhbGVuY2UpKSAlPiUKICBncm91cF9ieSh0YXZlc19jdHJ5LCBsZXZlbDEsIGxldmVsMnVuY29tbW9uLCBsZXZlbDJjb21tb24sIGxldmVsMywgCiAgICAgICAgICAgY2x1c3RlciwgcXVlc3Rpb24pICU+JQogIG11dGF0ZSh2YWxfbiA9IG4oKSkgJT4lCiAgZ3JvdXBfYnkodmFsX24sIGFkZCA9IFQpICU+JQogIG11bHRpX2Jvb3Rfc3RhbmRhcmQoInZhbGVuY2UiKSAlPiUKICB1bmdyb3VwKCkgJT4lCiAgcmVuYW1lKHZhbF9jaV9sb3dlciA9IGNpX2xvd2VyLAogICAgICAgICB2YWxfY2lfdXBwZXIgPSBjaV91cHBlciwKICAgICAgICAgdmFsX21lYW4gPSBtZWFuKQoKZGZfc2lnbmlmaWNhbmNlIDwtIGRfc2lnbmlmaWNhbmNlX251bTIgJT4lCiAgbXV0YXRlKHF1ZXN0aW9uID0gZ3N1YigiLl9udW0iLCAiIiwgcXVlc3Rpb24pKSAlPiUKICBmaWx0ZXIoIWlzLm5hKHNpZ25pZmljYW5jZSkpICU+JQogIGdyb3VwX2J5KHRhdmVzX2N0cnksIGxldmVsMSwgbGV2ZWwydW5jb21tb24sIGxldmVsMmNvbW1vbiwgbGV2ZWwzLCAKICAgICAgICAgICBjbHVzdGVyLCBxdWVzdGlvbikgJT4lCiAgbXV0YXRlKHNpZ19uID0gbigpKSAlPiUKICBncm91cF9ieShzaWdfbiwgYWRkID0gVCkgJT4lCiAgbXVsdGlfYm9vdF9zdGFuZGFyZCgic2lnbmlmaWNhbmNlIikgJT4lCiAgdW5ncm91cCgpICU+JQogIHJlbmFtZShzaWdfY2lfbG93ZXIgPSBjaV9sb3dlciwKICAgICAgICAgc2lnX2NpX3VwcGVyID0gY2lfdXBwZXIsCiAgICAgICAgIHNpZ19tZWFuID0gbWVhbikKCmRmX2FsbF9yZXNwIDwtIGhjbHVzdF9kZl9ncm91cGVkICU+JSAKICBkaXN0aW5jdChxdWVzdGlvbiwgcXVlc3Rpb25fdGV4dCwgVVNfcHJldiwgIAogICAgICAgICAgIGxldmVsMSwgbGV2ZWwydW5jb21tb24sIGxldmVsMmNvbW1vbiwgbGV2ZWwzLCBjbHVzdGVyKSAlPiUKICByZW5hbWUocHJldl9VUyA9IFVTX3ByZXYpICU+JQogIGZ1bGxfam9pbihkZl9wcmV2YWxlbmNlKSAlPiUKICBmdWxsX2pvaW4oZGZfYXBwcmFpc2FsKSAlPiUKICBmdWxsX2pvaW4oZGZfdmFsZW5jZSkgJT4lCiAgZnVsbF9qb2luKGRmX3NpZ25pZmljYW5jZSkgJT4lCiAgbXV0YXRlKGxldmVsMiA9IGlmZWxzZShpcy5uYShsZXZlbDJ1bmNvbW1vbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKGxldmVsMmNvbW1vbiksIAogICAgICAgICAgICAgICAgICAgICAgICAgYXMuY2hhcmFjdGVyKGxldmVsMnVuY29tbW9uKSksCiAgICAgICAgIGNsdXN0ZXIgPSBmYWN0b3IoY2x1c3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCI4IiwgIjUiLCAiMSIsICIzIiwgIjIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjYiLCAiOSIsICI3IiwgIjQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJjbHVzdGVyIDgiLCAiY2x1c3RlciA1IiwgImNsdXN0ZXIgMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2x1c3RlciAzIiwgImNsdXN0ZXIgMiIsICJjbHVzdGVyIDYiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsdXN0ZXIgOSIsICJjbHVzdGVyIDcgIiwgImNsdXN0ZXIgNCIpKSwKICAgICAgICAgbGV2ZWwxID0gZmFjdG9yKGxldmVsMSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjg1MTMyIiwgIjY3OTQiKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkwxOiA4NTEzMiIsICJMMTogNjc5NCIpKSwKICAgICAgICAgbGV2ZWwyID0gZmFjdG9yKGxldmVsMiwKICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjg1MSIsICIzMiIsICI2NzkiLCAiNCIpLAogICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiTDI6IDg1MSIsICJMMjogMzIiLCAiTDI6IDY3OSIsICJMMjogNCIpKSwKICAgICAgICAgdGF2ZXNfY3RyeSA9IGZhY3Rvcih0YXZlc19jdHJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIlVTIiwgIkdoYW5hIiwgIlRoYWlsYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDaGluYSIsICJWYW51YXR1IikpKSAlPiUKICBzZWxlY3QodGF2ZXNfY3RyeSwgbGV2ZWwxLCBsZXZlbDIsIGxldmVsMnVuY29tbW9uLCBsZXZlbDJjb21tb24sIGxldmVsMywgCiAgICAgICAgIGNsdXN0ZXIsIHF1ZXN0aW9uLCBxdWVzdGlvbl90ZXh0LCBwcmV2X1VTLCAKICAgICAgICAgc3RhcnRzX3dpdGgoInByZXYiKSwgc3RhcnRzX3dpdGgoImFwcCIpLCBzdGFydHNfd2l0aCgic2lnIiksCiAgICAgICAgIHN0YXJ0c193aXRoKCJ2YWwiKSkKYGBgCgpgYGB7ciwgZmlnLndpZHRoID0gNiwgZmlnLmFzcCA9IDAuOH0KZGZfYWxsX3Jlc3AgJT4lCiAgZ2dwbG90KGFlcyh4ID0gcXVlc3Rpb24sIHkgPSBwcmV2X21lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSwgbGFiZWwgPSBwcmV2X24pKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhsZXZlbDEsIGxldmVsMiwgY2x1c3RlciksIAogICAgICAgICAgICAgcm93cyA9IHZhcnModGF2ZXNfY3RyeSksIAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLjUsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSBwcmV2X2NpX2xvd2VyLCB5bWF4ID0gcHJldl9jaV91cHBlcikpICsKICBnZW9tX3RleHQoc2l6ZSA9IDIsIHkgPSAwLjA1LCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHlsaW0oMCwgMSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gIlBSRVZBTEVOQ0U6IFByb3BvcnRpb24gb2YgcGFydGljaXBhbnRzIHdobyBlbmRvcnNlZCBleHBlcmllbmNlIiwKICAgICAgIHN1YnRpdGxlID0gIkJ5IHNpdGUgKHJvd3MpLCBxdWVzdGlvbiAoeC1heGlzKSwgYW5kIGxldmVscyAxLTIgZ3JvdXBpbmcgb2YgY2x1c3RlcnMgKGNvbHVtbnMpXG5OdW1iZXJzIGZvciBlYWNoIHF1ZXN0aW9uIGluZGljYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFydGljaXBhbnRzIGZyb20gdGhhdCBzaXRlIHdobyByZXNwb25kZWQgdG8gdGhhdCBxdWVzdGlvbjsgZXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBDSXMiLAogICAgICAgeCA9ICJRdWVzdGlvbiIsCiAgICAgICB5ID0gIlByZXZhbGVuY2UgKDAtMSkiLCBjb2xvciA9ICJTaXRlIikKYGBgCgo8UCBzdHlsZT0icGFnZS1icmVhay1iZWZvcmU6IGFsd2F5cyI+CmBgYHtyLCBmaWcud2lkdGggPSA2LCBmaWcuYXNwID0gMC44fQpkZl9hbGxfcmVzcCAlPiUKICBnZ3Bsb3QoYWVzKHggPSBxdWVzdGlvbiwgeSA9IGFwcF9tZWFuLCBjb2xvciA9IHRhdmVzX2N0cnksIGxhYmVsID0gYXBwX24pKSArCiAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhsZXZlbDEsIGxldmVsMiwgY2x1c3RlciksIAogICAgICAgICAgICAgcm93cyA9IHZhcnModGF2ZXNfY3RyeSksIAogICAgICAgICAgICAgc2NhbGVzID0gImZyZWVfeCIsIHNwYWNlID0gImZyZWVfeCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsdHkgPSAyKSArCiAgZ2VvbV9wb2ludHJhbmdlKGFlcyh5bWluID0gYXBwX2NpX2xvd2VyLCB5bWF4ID0gYXBwX2NpX3VwcGVyKSkgKwogIGdlb21fdGV4dChzaXplID0gMiwgeSA9IC0wLjk1LCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHlsaW0oLTEsIDEpICsKICB0aGVtZV9idygpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArCiAgbGFicyh0aXRsZSA9ICJBUFBSQUlTQUw6IE1lYW4gcmVzcG9uc2UgdG8gd2hldGhlciB0aGUgcGFydGljaXBhbnQgYXBwcmFpc2VkIGV4cGVyaWVuY2UgYXMgcmVsaWdpb3VzL3NwaXJpdHVhbCIsCiAgICAgICBzdWJ0aXRsZSA9ICJCeSBzaXRlIChyb3dzKSwgcXVlc3Rpb24gKHgtYXhpcyksIGFuZCBsZXZlbHMgMS0yIGdyb3VwaW5nIG9mIGNsdXN0ZXJzIChjb2x1bW5zKVxuTnVtYmVycyBmb3IgZWFjaCBxdWVzdGlvbiBpbmRpY2F0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBmcm9tIHRoYXQgc2l0ZSB3aG8gcmVzcG9uZGVkIHRvIHRoYXQgcXVlc3Rpb247IGVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgQ0lzIiwKICAgICAgIHggPSAiUXVlc3Rpb24iLAogICAgICAgeSA9ICJBcHByYWlzYWwgKC0xOiBubywgMDogdW5zdXJlLCArMTogeWVzKSIsIGNvbG9yID0gIlNpdGUiKQpgYGAKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjh9CmRmX2FsbF9yZXNwICU+JQogIGdncGxvdChhZXMoeCA9IHF1ZXN0aW9uLCB5ID0gdmFsX21lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSwgbGFiZWwgPSB2YWxfbikpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGxldmVsMSwgbGV2ZWwyLCBjbHVzdGVyKSwgCiAgICAgICAgICAgICByb3dzID0gdmFycyh0YXZlc19jdHJ5KSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZV94IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGx0eSA9IDIpICsKICBnZW9tX3BvaW50cmFuZ2UoYWVzKHltaW4gPSB2YWxfY2lfbG93ZXIsIHltYXggPSB2YWxfY2lfdXBwZXIpKSArCiAgZ2VvbV90ZXh0KHNpemUgPSAyLCB5ID0gLTAuOTUsIGNvbG9yID0gImJsYWNrIikgKwogIHNjYWxlX2NvbG9yX2JyZXdlcihwYWxldHRlID0gIlNldDIiKSArCiAgeWxpbSgtMSwgMSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gIlZBTEVOQ0U6IE1lYW4gcmVzcG9uc2UgdG8gd2hldGhlciBleHBlcmllbmNlIHdhcyBjb25zaWRlcmVkIHBvc2l0aXZlL25lZ2F0aXZlIiwKICAgICAgIHN1YnRpdGxlID0gIkJ5IHNpdGUgKHJvd3MpLCBxdWVzdGlvbiAoeC1heGlzKSwgYW5kIGxldmVscyAxLTIgZ3JvdXBpbmcgb2YgY2x1c3RlcnMgKGNvbHVtbnMpXG5OdW1iZXJzIGZvciBlYWNoIHF1ZXN0aW9uIGluZGljYXRlIHRoZSB0b3RhbCBudW1iZXIgb2YgcGFydGljaXBhbnRzIGZyb20gdGhhdCBzaXRlIHdobyByZXNwb25kZWQgdG8gdGhhdCBxdWVzdGlvbjsgZXJyb3IgYmFycyBhcmUgOTUlIGJvb3RzdHJhcHBlZCBDSXMiLAogICAgICAgeCA9ICJRdWVzdGlvbiIsCiAgICAgICB5ID0gIlZhbGVuY2UgKC0xOiBuZWdhdGl2ZSwgMDogbmV1dHJhbCwgKzE6IHBvc2l0aXZlKSIsIGNvbG9yID0gIlNpdGUiKQpgYGAKCjxQIHN0eWxlPSJwYWdlLWJyZWFrLWJlZm9yZTogYWx3YXlzIj4KYGBge3IsIGZpZy53aWR0aCA9IDYsIGZpZy5hc3AgPSAwLjh9CmRmX2FsbF9yZXNwICU+JQogIGdncGxvdChhZXMoeCA9IHF1ZXN0aW9uLCB5ID0gc2lnX21lYW4sIGNvbG9yID0gdGF2ZXNfY3RyeSwgbGFiZWwgPSBzaWdfbikpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGxldmVsMSwgbGV2ZWwyLCBjbHVzdGVyKSwgCiAgICAgICAgICAgICByb3dzID0gdmFycyh0YXZlc19jdHJ5KSwgCiAgICAgICAgICAgICBzY2FsZXMgPSAiZnJlZV94Iiwgc3BhY2UgPSAiZnJlZV94IikgKwogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAuNSwgbHR5ID0gMikgKwogIGdlb21fcG9pbnRyYW5nZShhZXMoeW1pbiA9IHNpZ19jaV9sb3dlciwgeW1heCA9IHNpZ19jaV91cHBlcikpICsKICBnZW9tX3RleHQoc2l6ZSA9IDIsIHkgPSAwLjA1LCBjb2xvciA9ICJibGFjayIpICsKICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZSA9ICJTZXQyIikgKwogIHlsaW0oMCwgMSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gNDUsIGhqdXN0ID0gMSwgdmp1c3QgPSAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsKICBsYWJzKHRpdGxlID0gIlNJR05JRklDQU5DRTogTWVhbiByZXNwb25zZSB0byBob3cgc2lnbmlmaWNhbnQgZXhwZXJpZW5jZSB3YXMgY29uc2lkZXJlZCIsCiAgICAgICBzdWJ0aXRsZSA9ICJCeSBzaXRlIChyb3dzKSwgcXVlc3Rpb24gKHgtYXhpcyksIGFuZCBsZXZlbHMgMS0yIGdyb3VwaW5nIG9mIGNsdXN0ZXJzIChjb2x1bW5zKVxuTnVtYmVycyBmb3IgZWFjaCBxdWVzdGlvbiBpbmRpY2F0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIHBhcnRpY2lwYW50cyBmcm9tIHRoYXQgc2l0ZSB3aG8gcmVzcG9uZGVkIHRvIHRoYXQgcXVlc3Rpb247IGVycm9yIGJhcnMgYXJlIDk1JSBib290c3RyYXBwZWQgQ0lzIiwKICAgICAgIHggPSAiUXVlc3Rpb24iLAogICAgICAgeSA9ICJTaWduaWZpY2FuY2UgKDA6IG5vdCwgMC41OiBzb21ld2hhdCwgMTogdmVyeSkiLCBjb2xvciA9ICJTaXRlIikKYGBgCgoK